2

我被困在工作中使用具有糟糕 UI 的产品,并试图通过 Chrome 中的 UserScripts 使其可口。为此,我试图通过 UserScripts 机制将 JavaScript 函数注入页面:

// 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()' >";

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

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

我错过了什么?

4

3 回答 3

8

<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);

演示

于 2011-04-06T23:46:44.643 回答
0

您需要在全局范围内定义该函数(将其放在 <head> 部分中)以在您执行的地方使用它。

于 2011-04-06T23:43:43.443 回答
-3

作为参考,我通过以下方式解决了它:

myDiv.innerHTML = myDiv.innerHTML + " <input type='text' id='txtSearch' name='txtSearch' style='position:absolute;top:8px;left:800px;width:50px' >";
myDiv.innerHTML = myDiv.innerHTML + " <input type='button' name='btnSearch' value='Go' onclick='fn()' style='position:absolute;top:8px;left:860px;width:35px'>";

addScript("function fn() {var obj = document.getElementById('txtSearch'); "
  + "if (obj != null) { "
  + "  var incidentId = document.getElementById('txtSearch').value; "
  + "  var currentURL = location.href; "
  + "  var splitResult = currentURL.split('/'); "
  + "  var projectId = splitResult[4]; "
  + "  location.href = 'http://site/SpiraTeam/' + projectId + '/Incident/' + incidentId + '.aspx'; "
  + " } }"
  , "fn");

}

于 2011-05-12T18:40:50.337 回答