【问题标题】:Retrieve [String] from [object HTMLCollection]从 [object HTMLCollection] 检索 [String]
【发布时间】:2024-01-18 14:43:01
【问题描述】:

我一直在为此苦苦挣扎。我有一个从 wkwebview 发送的有效 javascript 命令:

document.getElementById('qlist-wrapper').getElementsByClassName('question-summary narrow').toString();

当我从 Safari 控制台输入此内容时,我会返回

"[object HTMLCollection]"

但是当我尝试使用返回的对象时,我不知所措。我得到“EXC_BAD_ACCESS”(代码=1,加上一个地址)。有 4 个有效负载对象与“html: Any”对象相关联;他们都是0。这是上下文中的代码:

webView.evaluateJavaScript("document.getElementById('qlist-

wrapper').getElementsByClassName('question-summary narrow').toString();", completionHandler: { (html: Any, error: Error?) in
        print("\(html)")
        if let error = error {
            print("\(error.localizedDescription)")
        }
    })
}

最终我的目标是将 html 集合转换为 Swift 字符串数组。我怎么做?我非常欢迎 JSON 解决方案(可能使用 Alamofire),但我简化了我的方法以首先让某些东西工作。 (我过去曾与 Alamofire 合作过,但没有那么多 JSON)。 如果我在打印之前尝试查看变量,我会得到:

po html
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0xfffffffffffffff8).
The process has been returned to the state before expression evaluation.

【问题讨论】:

  • 听起来你正在取回一个数组,对吧?哪一行导致崩溃?
  • 没有。我得到了一个坏指针。 print("\(html)") 在这种情况下会导致异常,但即使在调试器中我也无法打印与变量关联的任何值。 (我会将此添加到问题中)
  • 我假设你已经检查了 errornil?
  • 是的。如果我在打印语句之前移动错误检查,我也会得到 EXC_BAD_ACCESS 错误。 (错误不为零,但也不能作为错误使用)
  • 也许你应该先修复你的 JavaScript。即使评估成功返回,你也不能对 string "[object HTMLCollection]" 做太多事情(你不应该在集合上调用 .toString())。

标签: javascript swift alamofire wkwebview htmlcollection


【解决方案1】:

这个问题我真的有两个问题:

1) 如何将 HtmlCollection 转换为数组?和

2) 为什么当我尝试使用以下结果时会出现异常 我来自 WKWebView 的 javascript 调用。

我解决了这个难题的第一部分,所以我将在此处记录并关闭它。一旦我对 JavaScriptCore 有了更好的处理(我期望最终解决方案所在的地方),我将发布一个新问题并从这里交叉引用该问题/解决方案。

如果我在 Safari 的 Web Inspector 控制台中键入以下内容,我会得到从 HtmlCollection 到 Array 的所需转换:

Array.prototype.slice.call(document.getElementById('qlist-wrapper').getElementsByClassName('question-summary narrow'));

【讨论】: