javascript - 如何动态注入(inject) JavaScript 函数?

标签 javascript google-chrome dom-events userscripts

我在工作中一直在使用一个用户界面糟糕的产品,并试图通过 Chrome 中的 UserScripts 让它变得可口。为此,我试图通过 UserScripts 机制将 JavaScript 函数注入(inject)页面:

// find the div
var dropDown = document.getElementById("tstGlobalNavigation_ddlChooseProject");

// inject function
dropDown.innerHTML = dropDown.innerHTML + "<script>function gotoIncident(){alert('111')}</script>";        

// inject a button
dropDown.innerHTML = dropDown.innerHTML + "&nbsp;&nbsp;&nbsp;<input type='button' name='btnSearch' value='Go' onClick='javascript:gotoIncident()' >";

如您所见,我正在注入(inject)一个按钮和一个函数 (gotoIncident),当用户单击该按钮时应触发该函数。

按钮确实出现在屏幕上,但当我单击它时,javascript 调试器告诉我 gotoIncident 未定义。

我错过了什么?

最佳答案

注入(inject) <script>标记到 <head>其中包含一个自调用函数:

var head = document.getElementsByTagName('head')[0],
    script = document.createElement('script');
    
script.src = 'path/to/script.js';    
head.appendChild(script);

引用的脚本看起来像这样:

(function(){
    // do your stuff here    
})();

编辑

如何将其作为内联脚本:

function fn() {
    alert('hello JS');
}

var head = ...,
    script = ...;
    
// FF doesn't support innerText
script[script.innerText ? 'innerText' : 'textContent'] = '(' + fn + ')()';
head.appendChild(script);

Demo

关于javascript - 如何动态注入(inject) JavaScript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574231/

相关文章:

javascript - 使用 JS 动态改变元素样式 - Joomla ChronoForms

javascript - 日历未显示在 Bootstrap datetimepicker 中

javascript - AngularJS 多步表单验证

javascript - Chrome Commands API 使默认弹出窗口可见

javascript - 循环遍历 FileReader 的文件,输出始终包含循环的最后一个值

javascript - 在事件处理程序中获取原型(prototype)

javascript - 如何动态地将视频字幕轨道设置为默认轨道

google-chrome - Google Chrome 控制台不会自动向下滚动

javascript - Chrome关闭标签页后删除localstorage Vuejs

javascript - Paper.js 事件行为因浏览器而异