Есть ли способ ссылки на элемент ввода непосредственно перед функцией JavaScript без использования его идентификатора? - PullRequest
0 голосов
/ 25 января 2011

При вызове функции со страницы в javascript, есть ли способ ссылаться на элемент непосредственно перед функцией без ее идентификатора? например,

<select>...</select>

<script type="text/javascript">
    my_function(previous_element);
</script>

есть ли способ отправить элемент select в my_function () без , используя идентификатор элемента select?

Заранее спасибо.

Редактировать: Больше информации о том, что я пытаюсь сделать.

Я использую плагин rails, который генерирует копию группы элементов формы с уникальным идентификатором для каждого элемента. Я пытаюсь вызвать функцию для определенного элемента формы (select) в группе - в идеале я бы добавил onload к элементу select, но этого не существует для элементов формы. вызов функции изнутри страницы - лучшее, что я могу придумать. Поскольку элементы копируются с использованием ajax (то есть, типа «Добавить новый адрес»), если я добавлю элемент с известным идентификатором, он также будет скопирован (и создаст несколько элементов с одинаковым идентификатором, что приведет к путанице). Я знаю, что это действительно грязно, но мне трудно найти другое решение, и этот плагин уже хорошо интегрирован в мой проект.

Ответы [ 7 ]

1 голос
/ 25 января 2011

Мне пришлось решать эту проблему в среде, где я не могу контролировать какой-либо контент, кроме самого тега script (читай: реклама).В настоящее время я использую следующее решение:

  1. Включите файл, а не встроенный скрипт.
  2. Поместите в этот файл переменную, содержащую URL, который вы будете использовать дляатрибут src.Если это не известно во время написания кода, вам придется ответить на запрос этого файла с некоторым содержимым, сгенерированным сервером, а не со статическим файлом.(Он по-прежнему может быть в основном статическим / шаблонным, но вам придется читать URL-адрес из фактического запроса, а не задавать его жестко).
  3. Найдите сам скрипт-тег, выполнив поиск с помощью src-атрибут, равный переменной URL-адреса запроса, которую вы поместили в сценарий на шаге 2.
  4. Обход DOM на один шаг назад, чтобы найти элемент перед тегом сценария.(если вам нужны подробности, см. ответ Криса Кукена).
1 голос
/ 25 января 2011

Поскольку вы используете гем nested_forms и хотите получить доступ к определенному элементу после его динамического добавления в форму, не могли бы вы попытаться сделать следующее?

В разделе head вашего HTML-кода:после того, как вы включили файл nested_form.js, вы поместили этот javascript (вы можете использовать метод rails content_for или поместить в другой файл javascript и включить его):

<script type="text/javascript">
  $(function() {
    $('form a.add_nested_fields').live('click', function() {

      var form = $(this).parent(); // this is the form

      // you can now traverse the DOM searching for the specific element
    });
  });
</script>

Я не тестировал код, ноЯ думаю, что событие будет выполнено после добавления дочерних полей.Поскольку вы можете получить доступ к форме внутри события, вы можете пройти через DOM, чтобы найти конкретный элемент, к которому вы пытаетесь обратиться.

Надеюсь, это поможет!

1 голос
/ 25 января 2011

Я не думаю, что вы можете получить ввод перед блоком скрипта без какой-либо ссылки вообще, поскольку, насколько я знаю, скрипт, работающий в блоке скрипта, никогда не узнает, где в коде находится блок скрипта, и я не думаю, что существует любой указатель на блок скрипта.

Возможно, вам понадобится использовать идентификатор в блоке сценария и оттуда использовать функции jQuery из ответа Криса Кукена

0 голосов
/ 25 января 2011

Я не совсем уверен, что это то, что вы пытаетесь сделать, но почему бы не вызвать функцию для события из самого элемента?

е

function func(data){
    //code here
}

<select onchange="func(this.value);">
    <option value="Hello">Hello</option>
    <option value="World">World</option>
</select>

Таким образом, вы можете мгновенно передать значения.

0 голосов
/ 25 января 2011

Есть способ

   function prevElement(name) {
    var script = document.getElementsByTagName('script');
    var me = script[script.length-1];
    name = name.toLowerCase();
    return (function(obj) {
        if(!obj) return null;
        var n = obj.nodeName.toLowerCase();
        if(n == name) return obj;
        if(n == 'body') return null;
        if(obj.previousSibling) return arguments.callee(obj.previousSibling, name);
        return null;
    })(me.previousSibling);
 }
  var span = prevElement('span');
  alert(span);
0 голосов
/ 25 января 2011

Вы можете передать объект в качестве параметра вашей функции jquery, если это поможет ... (... лучший пример) Предполагая, что "rodd" является объектом jquery, который вы выбрали ...

function Callme(rodd) {
  if (rodd.is(":checked")) {
    // ...
  }
}
0 голосов
/ 25 января 2011

если вы используете jquery, вы получаете .next() .previous() .parent() и .children() для обхода DOM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...