Jquery Chrome扩展添加youtube标签

Jquery Chrome扩展添加youtube标签,jquery,javascript-events,google-chrome-extension,Jquery,Javascript Events,Google Chrome Extension,我正在编写一个chrome扩展,我想在YouTube编辑页面中添加多个标签。我可以将标记文本作为字符串插入,每个标记用逗号分隔。YouTube要获取这个逗号分隔的字符串并将其正确拆分为标记,标记插入空间需要接收keyup或change事件 我看过很多关于触发关键事件的堆栈溢出帖子,但没有一条代码表明它们对我有用 不幸的是,由于某种原因,当我尝试触发事件时,我使用以下代码得到一个错误: document.getElementsByClassName("video-settings-add-tag"

我正在编写一个chrome扩展,我想在YouTube编辑页面中添加多个标签。我可以将标记文本作为字符串插入,每个标记用逗号分隔。YouTube要获取这个逗号分隔的字符串并将其正确拆分为标记,标记插入空间需要接收keyup或change事件

我看过很多关于触发关键事件的堆栈溢出帖子,但没有一条代码表明它们对我有用

不幸的是,由于某种原因,当我尝试触发事件时,我使用以下代码得到一个错误:

document.getElementsByClassName("video-settings-add-tag")[0].focus();
document.getElementsByClassName("video-settings-add-tag")[0].keyup();
错误状态为UncaughtTypeError:undefined不是函数;焦点代码是有效的,所以我确定的目标是正确的元素

这很奇怪,因为其他事件实际上并没有完成我需要的工作,即聚焦、模糊和单击。YouTube将事件侦听器绑定到视频设置add tag元素,我需要触发该元素才能将字符串拆分为标记

有人知道为什么这样不行吗

另外,我还尝试定义变更事件,以查看其是否有效,并且此代码没有抛出错误,但也没有执行任何操作:

var event = new KeyboardEvent('change');
document.getElementsByClassName("video-settings-add-tag")[0].dispatchEvent(event);
document.getElementsByClassName("video-settings-add-tag")[0].change;

感谢您的反馈。

我以前遇到过类似的情况,我的内容脚本无法访问与页面一起提供的脚本中定义的对象和函数,并抛出了类似的未捕获类型错误:未定义不是函数错误,但我确实需要访问页面上的方法和属性,因为我不想重新实现它们

这与Chrome沙盒如何通过向内容脚本传递一个安全DOM有关。更多信息

您可以通过设置内容脚本,使其在页面上定义自己,而不是在内容脚本上下文中执行,来解决这个问题。像这样:

// Here's where all my page-extension logic takes place:
doTheThing = function() {
    //all my logics
}

//add logic to window. Injecting the script inline grants it
//access to all objects on the window, including page scripts.
var script = document.createElement('script');
script.type = "text/javascript";
script.textContent = '(' + doTheThing.toString() + ')();';
document.body.appendChild(script);
如果您需要访问后台脚本,这种方法会使事情变得非常复杂,但如果需要更多的工作,这种情况仍然是可行的。希望这有帮助

至于以编程方式触发事件,我认为您混淆了jQuery对象可用的函数和本机DOM对象可用的函数。请记住,jQuery存储本机DOM事件之外的事件,因此如果YouTube正在创建jQuery事件,则需要从jQuery对象调用相应的函数:

$('.video-settings-add-tag')[0].keyup();
如果事件已注册到本机DOM对象,则需要创建一个事件对象并分派它:

var ch = document.createEvent('HTMLEvents');
ch.initEvent('keyup', 13, true);
document.getElementsByClassName("video-settings-add-tag")[0].dispatchEvent(ch);

这是否在附加到窗口的内容脚本中?它位于扩展清单中content_脚本下定义的eventPage.js文件中。我对扩展名编写还不熟悉,所以我不知道这是否正确,但该文件中的所有其他代码都可以很好地处理该页面…谢谢!在我解决如何使用这个问题之前,我应该担心我不能在Chromes developer控制台中使用相同的代码触发事件,还是因为它与页面以与扩展相同的方式进行交互而需要触发事件?请参阅我的编辑,它应该弄清楚如何以编程方式触发事件:谢谢!因此,只需使用您发布的最后一段代码就可以工作,而无需注入函数,正如您所说,这会导致访问后台脚本时出现很多问题。我以前曾尝试添加一个keyup事件,如上面所列,但与此事件相比,它没有起作用。你用的是initEvent,我用的是keyboardEvent,我想知道为什么一个不起作用。不管怎样,问题都解决了!非常感谢!