首页 > 解决方案 > 将“doJavaScript”返回值分配给变量(数组)的问题

问题描述

我正在尝试使用 JXA 并尝试“移植”一个小脚本,该脚本从网页中解析曲目名称。此脚本当前作为 Keyboard Maestro 宏工作,并在当前 Safari 窗口中执行:

var trackBlock = document.getElementsByClassName("track tracklist_track_title");
var trackList = [];
for (var a of trackBlock) {
    trackList.push(a.innerText);
}
trackList.join("\n");

问题是如果doJavaScript返回单个字符串(变量trackName1包含曲目标题),我的移植尝试在 JXA 中效果很好:

var sfr = Application("Safari");
var trackName1 = sfr.doJavaScript('document.getElementsByClassName("track tracklist_track_title")[1].innerText', { in: sfr.windows[0].currentTab });
trackName1 // contains track name

但是,如果我更改代码,以便doJavaScript返回一个数组(就像在初始代码中一样),则该变量为空。请你解释一下:我做错了什么?

var sfr = Application("Safari");
var trackBlock = sfr.doJavaScript('document.getElementsByClassName("track tracklist_track_title")', { in: sfr.windows[0].currentTab });
trackBlock[0].innerText; // null

谢谢!

标签: javascript-automation

解决方案


回答你的第二个问题:

为什么第一个 doJavaScript 调用返回 null,而第三个返回预期值?

var scr2run = 'document.getElementsByClassName("tracklist_track_title")';
var scr2run1 = 'document.getElementsByClassName("tracklist_track_title")[0]';
var scr2run2 = 'document.getElementsByClassName("tracklist_track_title")[0].innerText';

第三个 JavaScript 返回一个文本值,而前两个没有。它们返回一个元素集合和一个元素。


推荐阅读