Как динамически внедрить функцию JavaScript? - PullRequest
2 голосов
/ 07 апреля 2011

Я застрял, используя продукт с ужасным пользовательским интерфейсом на работе и пытаясь сделать его приемлемым с помощью пользовательских скриптов в Chrome.С этой целью я пытаюсь внедрить функцию JavaScript на страницу через механизм UserScripts:

// 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 не определено.

Чего мне не хватает?

Ответы [ 3 ]

7 голосов
/ 07 апреля 2011

Внедрите тег <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);

Демо

0 голосов
/ 12 мая 2011

Для справки я решил это следующим образом:

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

}

0 голосов
/ 07 апреля 2011

Вам нужно определить функцию в глобальной области видимости (поместить ее в раздел ), чтобы использовать ее там, где вы делаете.

...