当 运行 来自书签时,Bookmarklets 不起作用,但来自控制台

Bookmarklets doesnt work when run from bookmark, but works from console

我正在尝试创建一个小书签,它将在网页的文本区域中插入一些文本(网页供内部使用,因此没有链接意义)。

这是我试过的 javascript 代码示例:

(function(){document.getElementById("textareaID").value="Some text";})();

我想指出的是,我尝试了不同的元素选择器(byClass、query...)和不同的属性(甚至是 tabindex)以获得相同的结果。也在 Chrome 和 IE11 中尝试过。

所以,由于某些奇怪的原因,我的 javascript 运行s 当我从控制台(或作为片段)运行 它时,我得到了一个错误 "Cannot set property 'value' of null" 当我尝试从书签菜单中 运行 它时。

我尝试自己创建一个小书签

javascript:(function(){document.getElementById("textareaID").value="Some text";})();

并尝试使用在线书签创建器对特殊字符进行编码

javascript:(function(){document.getElementById(%22textareaID%22).value=%22Some%20text%22;})();

但运气不好。

Bookmarklets 绝对可以在页面上工作(尝试使用警报 "Hello"),但我似乎有一个问题 "capturing" 元素。 我还注意到某些元素的 ID 有时会发生变化(虽然不知道为什么),但我总是检查以确保我尝试使用的 ID 存在或我使用一些固定值,如 tabindex。此外,正如我所说,当从控制台 运行 时它可以工作,所以我不可能以某种方式搞砸了......或者我可以吗?

所以问题出在执行上下文上。 因为元素的 ID 正在改变,所以我必须在 运行 js 从控制台检查它们之前检查它们并将执行上下文从 top 更改为元素所在的位置。这就是为什么它是从控制台而不是书签工作的原因...

因此,要写入特定框架内的文本框:

let Iframe =  document.getElementById('yourIframe').contentWindow.document
let value = Iframe.getElementById("textboxID").value = "Some Text"

之后唯一剩下的就是将所有内容包装在 javascript:(function(){..your code here..})(); 中以创建书签。