【发布时间】:2021-12-02 00:57:38
【问题描述】:
我正在尝试在新选项卡中运行脚本。我使用的代码是这样的:
$ = jQuery;
function openAndPush(url, id) {
var win = window.open('https://example.com' + url + '?view=map');
var element = $('<script type="text/javascript">console.log("Starting magic...");var region_id='+id+';$=jQuery;var p=$(\'div["se:map:paths"]\').attr(\'se:map:paths\');if(p){console.log("Found! pushing..."); $.get(\'https://localhost:9443/addPolygon\', {id: region_id, polygon: p}, function(){console.log("Done!")})}else{console.log("Not found!");}</script>').get(0);
setTimeout(function(){ win.document.body.appendChild(element);
console.log('New script appended!') }, 10000);
}
考虑以下几点:
- 我在this answer 中受到启发,但改用了 jQuery。
- 我在检查器/控制台中从https://example.com 中的另一个页面运行此代码(是的,实际域不是 example.com - 但相对于原始选项卡,目标 url 始终在同一个域中)到避免 CORS 错误。
- 当我运行函数(例如,
openAndPush('/target', 1))然后在 另一个 检查器中检查代码时,其中一个用于 new 窗口,控制台消息Starting magic...未显示(我等待 10 秒甚至更多)。但是,新的 DOM 元素(我正在创建的这个脚本)显示在 Elements 选项卡中(并且,在 first 控制台/检查器中,我可以看到New script appended!消息)。
(在这两种情况下jQuery 都存在,但不占用$ 标识符,这似乎是未定义的 - 所以我手动占用它)
我的结论是我的脚本没有在新窗口中执行。
我错过了什么?如何确保代码正在执行?
【问题讨论】:
-
我对你的第二点感到困惑。您的意思是您正在域
aaa.com上运行一个脚本,该脚本会打开一个到bbb.com的窗口,然后添加一个<script>? -
没有。域始终相同。我只是将其更改为 example.org
-
这个答案stackoverflow.com/questions/1199676/… 似乎表明您不能按照您显示的方式进行操作,但必须构建并附加一个节点。我似乎记得脚本在作为 html 注入时没有被评估,可能是因为 DOM 没有重新加载,也没有加载和解析脚本......没有触发 onLoad 事件来获取它......或者我记得。