Хотя я согласен с n3rd и проголосовал за него, я понимаю, что вы говорите, что у вас есть конкретный вызов, когда вы не можете добавить идентификатор в разделы html, кроме как по сценарию.
Таким образом, это было бы моим предложением для включения сценария, осведомленного о его месте в иерархии DOM, в этом случае:
Добавьте id к вашему тегу сценария . (Да, у тегов сценария тоже могут быть идентификаторы.)
- ех.
<script id="specialagent" type="text/javascript">
- Добавьте одну строку в вашу встроенную функцию скрипта, которая получает элемент скрипта по id.
- ех.
this.script = document.getElementById('specialagent');
... И еще один, который получает parentNode элемента скрипта.
- ех.
var targetEl = this.script.parentNode;
Подумайте о реструктуризации вашей функции в функцию, которая выполняет себя, если вы можете.
- В идеале он выполняется немедленно, без необходимости вызова onload.
- см. Краткий пример, следующий.
КРАТКИЙ ПРИМЕР:
<script id="specialagent" type="text/javascript">
var callMe = function(arg1,arg2,arg3) {
this.script = document.getElementById('specialagent');
var targetEl = this.script.parentNode.nodeName=="DIV" && this.script.parentNode;
//...your node manipulation here...
}('arg1','arg2','arg3');
</script>
Следующий код TEST при запуске подтверждает, что функция определила свое место в DOM и, что важно, свой parentNode. Тест имеет узлы деления с идентификатором, только для целей теста. Они не нужны для функции, чтобы идентифицировать их, кроме как для тестирования.
ТЕСТ-КОД:
<html>
<head>
<title>Test In place node creation with JS</title>
</head>
<body>
<div id="one">
<h2>Child of one</h2>
<div id="two">
<h2>Child of two</h2>
<script id="specialagent" type="text/javascript">
var callMe = function(arg1,arg2,arg3) {
this.script = document.getElementById('specialagent');
var targetEl = this.script.parentNode;
/*BEGIN TEST*/
alert('this.script.id: ' + this.script.id);
alert('targetEl.nodeName: ' + targetEl.nodeName + '\ntargetEl.id: '+targetEl.id);
alert('targetEl.childNodes.length: ' + targetEl.childNodes.length);
var i = 0;
while (i < targetEl.childNodes.length) {
alert('targetEl.childNodes.'+i+'.nodeName = ' + targetEl.childNodes[i].nodeName);
++i;
}
/*END TEST - delete when done*/
//...rest of your code here...to manipulate nodes
}('arg1','arg2','etc');
</script>
</div>
</div>
</body>
</html>