Как выбрать родителя элемента <script>

<div id="scriptparent">
    <script type="text/javascript">
         $( /* select above <div> from <script> ... without id and div property */ )
    </script>
</div>

из кода у меня есть блок <script> внутри блока <div>. Я хотел бы выбрать <div> из <script> без идентификаторов, классов, селекторов. Как я могу достичь этого?

Ответы

Ответ 1

Если код такой, как вы его показали, и поэтому он запускает сразу, по мере создания DOM вы можете что-то сделать с document.body.lastChild.

Итак, короткий ответ на ваш вопрос:

var div = $(document.body.lastChild).closest('div');

Я немного параноик, в моих тестах (в Chrome) document.body.lastChild есть div, но используя closest Я имею дело с возможностью, чтобы он мог быть script для некоторых движков.

Длительный ответ - пример: Live Copy | Источник

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<meta charset=utf-8 />
<title>Last Element ID</title>
  <script>
    function setUpParentDiv() {
      var div = $(document.body.lastChild).closest('div');
      switch (div.attr("id")) {
        case "div1":
          div.css("color", "blue");
          break;
        case "div2":
          div.css("color", "green");
          break;
      }
    }
  </script>
</head>
<body>
  <div id="div1">
    I'm div1
    <script>
      setUpParentDiv();
    </script>
  </div>
  <div id="div2">
    I'm div2
    <script>
      setUpParentDiv();
    </script>
  </div>
</body>
</html>

Ответ 2

 <div id="scriptparent">
        <script type="text/javascript">
            var scriptTag = document.scripts[document.scripts.length - 1];
            var parentTag = scriptTag.parentNode;
            alert(parentTag.id);
        </script>
    </div>

Ответ 3

Тег script поддерживает все глобальные атрибуты HTML, который включает id. Добавьте id в тэг script, который будет использоваться как крючок для выбора родителя.

<div id="scriptparent">
<script id="myScript" type="text/javascript">
   alert($("#myScript").parent().attr("id"));
</script>

Рабочий пример: http://jsfiddle.net/5fTyK/

Ответ 4

Если ваши теги script не отложены (все загружаются синхронно), это будет работать:

<div id="scriptparent">
    <script type="text/javascript">
        var thisScript = document.scripts[document.scripts.length - 1],
            parent = thisScript.parentNode; // points to div#scriptparent
    </script>
</div>

Ответ 5

Ни одно из вышеперечисленных решений не работало для меня, мой script вставляемый angular как часть CMS и в повторяемый блок.

Имя класса some_div должно быть уникальным для таких типов вставок.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="some_div" style="display: none;"></div>
<script type="text/javascript">
	setTimeout(function(){
		var local_id = 'Div_' + Math.round(Math.random() * 100000);
		$('.some_div').not( ".processed" ).attr({id: local_id})
		var alert_div = $('#' + local_id);
		
		alert_div.show().html('nearby div')
		alert_div.addClass('processed');
	}, 20)
</script>