Prototype.js получает текст из элемента - PullRequest
6 голосов
/ 24 января 2011

Я новичок в Protoype.JS и просто немного его тестирую, потому что слышал, что это хорошо, но я застрял довольно быстро.Как бы легко это ни было с jQuery, похоже, конец света - получить текст в элементе.Я пробовал innerHTML несколькими способами, но единственное, что я могу получить, это «undefined».

alert($$('.mnu_item').innerHTML);
alert($('content').innerHTML);

Ни одна из этих работ.Content - это div с идентификатором «content», а .mnu_item - это якорный тег с классом «.mnu_item».Я не понимаю, в чем проблема, возможно, что-то глупое, но было бы здорово, если бы кто-то мог указать мне правильное направление!не работает, но это селектор класса.Вторая строка кода выше работает.Как я могу выбрать элемент по классу в последней версии Prototype, если это не правильно?

Ответы [ 4 ]

7 голосов
/ 24 января 2011

Загружается ли DOM при запуске сценария?Если вы не запускаете этот код в window.onload или размещаете его в конце тела, тогда элементы не существуют, когда он выполняется.

Попробуйте разместить свой скрипттолько внутри закрывающего тега </body>.

<body>
    <!-- my content -->

    <script type="text/javascript">
        alert($('content').innerHTML);
    </script>
</body>

Кроме того, ваша первая строка выбрана правильно, но вернет массив элементов, поэтому innerHTML будет undefined.

Чтобы перебрать массив, вы можете сделать это:

$$('.mnu_item').each(function(val,i) {
    alert(val.innerHTML);
});

или, если вы хотите получить массив значений innerHTML, сделайте следующее:

var values = $$('.mnu_item').map(function(val,i) {
    return val.innerHTML;
});
1 голос
/ 24 января 2011

Убедитесь, что DOM загружен, прежде чем запускать следующие тесты:

$(document).on('dom:loaded', function () {
  /* code to execute after dom has loaded */
})

Первая строка кода $$ ('. Mne_item') не работает, поскольку $$ возвращает массив всех элементов, соответствующих правилу css. Таким образом, $$ ('. Mne_item') дает массив всех элементов dom, который имеет класс mne_item . Вы можете задать первый, используя метод first или выполнить итерацию по всем пунктам, например так:

$$('.mne_item').each(function(elem) {
  // elem is the li elements extended by all Element methods of prototype
});

Если вы используете $ в jQuery, он на самом деле использует похожий шаблон, но скрывает каждую конструкцию. Он просто применяет цепочечный метод ко всем элементам или только к первому.

Вторая строка кода $ ('content'). InnerHTML должна работать. $ - это ярлык для document.getElementById , поэтому он должен вернуть вам DOM-узел. Причина, по которой это не работает, в том, что нет узла, где id = content, возможно, потому что dom еще не загружен.

Для получения дополнительной информации о методах прототипа смотрите API: http://api.prototypejs.org/

Также проверьте стандартные методы DOM: http://quirksmode.org/dom/w3c_core.html

0 голосов
/ 28 июня 2017

var text = $$ ('label [for = "display_on_amazon"]'). First (). TextContent;

Вышеупомянутый код работал для меня.

Относительно $$ ('. Mnu_item'). InnerHTML

Когда вы пытаетесь выбрать с помощью селектора класса, prototype возвращает массив из нескольких элементов, используя метод [0] или first (), система укажет на первый элемент в этом массиве, после чего вы можете использовать innerHtml (чтобы получить html внутри элемента) или textContent (для получения текстового содержимого этого элемента, нативный метод javascript)

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

$ ('content'). InnerHTML должен работать.Проверьте свой HTML, убедитесь, что идентификатор уникален.

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