从Chrome内容脚本“隔离世界”内部更新knockout.js观察

时间:2016-06-17 06:00:50

标签: javascript jquery ajax google-chrome knockout.js

我有一个问题,我试图以多种不同的方式解决这个问题,但我完全被难以接受,而且我找不到的任何东西都可以帮助......

问题

我正在编写Chrome扩展程序,以便在通过AJAX提交之前修改网页上某些输入元素的值。使用Knockout模型创建元素,该模型是基于初始AJAX请求的响应构建的。问题是,每当我的Chrome内容脚本更新UIAlertController *alertController = [UIAlertController alertControllerWithTitle:alertTitle message:alertMessage preferredStyle:UIAlertControllerStyleAlert]; [self presentViewController:alertController animated:YES completion:nil]; 元素的值时,Knockout observable都不会更新(并且最终的POST请求使用序列化的Knockout对象,这些对象没有更改)。

我见过的几种解决方案也提出了建议,

  1. 直接更新Knockout observable - 不可能,因为我的脚本位于自己的沙箱中(或“孤立的世界”)
  2. 在更新其值后手动触发元素上的input事件 - 我所以非常希望这会起作用。但是,它似乎什么都不做。我今天玩了几个小时后的理解是,这个事件被隔离到了沙箱(但我可能是错的)。
  3. 我能看到的唯一可能的解决方案(这很难看)是阻止POST并直接修改请求的内容。但是当我可以修改DOM中的表单时,这似乎很愚蠢......

    有什么想法吗?我真的可以使用一些帮助。

1 个答案:

答案 0 :(得分:1)

由于this的回答,我想通了。我不知道我可以将JavaScript注入页面;所以,我将change事件触发器注入到DOM中,这导致它在页面范围内而不是在我的内容脚本范围内被调用。

var script = document.createElement('script');
script.textContent = "$(\'.myInputField\').eq(" + i + ").change()";
(document.head || document.documentElement).appendChild(script);
script.parentNode.removeChild(script);