开发者问题收集

Javascript 引用错误,但在使用书签时有效

2017-12-30
225

我试图在已完全加载的页面上执行一些 Javascript。

为了测试 javascript,我创建了一个书签,在页面加载时单击它,它正确执行:

javascript:(array.find('value').__showAllRecords(event))

我想在我正在编写的 AppleScript 中使用此 Javascript,并将其发送到 chrome,但由于某种原因,我收到此错误:

Uncaught ReferenceError: array is not defined
    at <anonymous>:1:1

它仅当我在 AppleScript 编辑器中运行脚本时发生,而不是在我使用书签时发生。这是我的 AppleScript 代码:

tell application "Google Chrome"
    execute front window's active tab javascript "array.find('value').__showAllRecords(event)"
end tell
2个回答

变量 array 是在脚本执行后的某个时间点创建的,因为您不知道何时可以重试,直到它存在:

(function(){
  function trySomething(){
    try{
      array.find('value').__showAllRecords(event);
      console.log("worked, stop trying");
      clearInterval(timer);
    }catch(e){
      console.log("didn't work, try again",e);
    }
  }
  var timer = setInterval(trySomething,1000);
}())

//create the array object some time in the future (not actually an Array type)
//this is not part of your script but would be created by the page
//at some point
setTimeout(
  ()=>window.array={find:x=>({__showAllRecords:x=>x})}
  ,6000
)
HMR
2017-12-30

不幸的是,applescript 无法访问非默认全局变量。请参阅线程 https://bugs.chromium.org/p/chromium/issues/detail?id=543437

但有一个解决方法,您可以将数组设置为 div 的 innerHTML 并从 applescript 中检索值。因此,例如这是我的 div <div id="test">[1,2,3]</div> ,您可以执行

tell application "Google Chrome"
    execute front window's active tab javascript "console.log(document.getElementById(\"test\").innerHTML)"
end tell

希望这有帮助

cdoshi
2017-12-30