Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   .click() по элементам (https://javascript.ru/forum/jquery/71388-click-po-ehlementam.html)

Nikolay37 15.11.2017 12:07

Цитата:

Сообщение от рони (Сообщение 470109)
:-? start плохое имя для функции, может переименовать

Увы, но это тоже роли не играет

Nexus 15.11.2017 12:08

Цитата:

Сообщение от Nikolay37
Ну я могу в целом это в переменную записать, смысл не изменится

Изменится.

Nikolay37 15.11.2017 12:12

Цитата:

Сообщение от Nexus (Сообщение 470110)
У вас в логике работы дырень.
Текущий код будет проверять только первый элемент выборки на соответствие его контента значению эл. массива basename.
Попробуйте так:
let baseName = "apple,pineapple,translate".split(',')
let i = 0
let n = 0
let nodes = document.getElementsByClassName('name');
console.log('Найдено элементов: ' + nodes.length);
start()

function start() {
    for (i; i < nodes.length; i++) {
        console.log(nodes[i].innerText + ' == ' + baseName[n] + ' -> ' +
            (nodes[i].innerText == baseName[n] ? 'true' : 'false'));
        if (nodes[i].innerText == baseName[n]) {
            console.log('CLICK');
            nodes[i].click();
            break; //Если нужно кликнуть только по одному элементу
        }
    }
    if (n < baseName.length - 1) {
        i = 0
        n++
        console.log('Restart');
        start()
    }

}

В логике все хорошо, поскольку нужно проверить несколько элементов. С break скрипт начинает отлично работать, но это не то что нужно, поскольку надо кликнуть по нескольким элементам.

Кстати прошу заметить, ваш код тоже не работает, если убрать оттуда break

Nexus 15.11.2017 12:44

Цитата:

Сообщение от Nikolay37
В логике все хорошо, поскольку нужно проверить несколько элементов.

let baseName = "apple,pineapple,translate".split(',')
let i = 0
let n = 0

function start() {
    for (i; i < document.getElementsByClassName('name').length; i++) {
        if (document.getElementsByClassName('name')[i].innerText == baseName[n]) {
            document.getElementsByClassName('name')[i].click()
        }

        if (n < baseName.length - 1) {
            i = 0
            n++
            start()
        }
    }
}

Что тут хорошего?
Вы пытаетесь в 6-й строке пробежаться по всем элементам с классом "name", но сразу же в конце первой итерации вызываете эту функцию вновь сбрасывая счетчик "i" и инкрементируя значение "n". Т.е. при втором вызове этой функции проверяться будет снова первый элемент с классом "name", но уже искомое значение будет другим.
После того, как счетчик "n" превысит baseName.length продолжат выполняться предыдущие циклы. Они будут проверять соответствие контента элементов (начиная со второго и до конца) с классом "name", но т.к. n==baseName.length, то искать циклы будут элемент, чей контент равен null. Т.е. условие для элементов с индексом > 1 никогда не выполнится, поскольку строка никогда не будет равна null (равна !== эквивалентна).

Upd. [][1]===undefined, т.е. в тексте выше "null" читайте как "undefined", но сути не меняет.

Nexus 15.11.2017 12:46

Цитата:

Сообщение от Nikolay37
Кстати прошу заметить, ваш код тоже не работает, если убрать оттуда break

Смотрите консоль, там отображается исчерпывающая информация.
Пофиксить баг труда не составит.

Nikolay37 15.11.2017 13:17

Цитата:

Сообщение от Nexus (Сообщение 470135)
Что тут хорошего?
Вы пытаетесь в 6-й строке пробежаться по всем элементам с классом "name", но сразу же в конце первой итерации вызываете эту функцию вновь сбрасывая счетчик "i" и инкрементируя значение "n". Т.е. при втором вызове этой функции проверяться будет снова первый элемент с классом "name", но уже искомое значение будет другим.
После того, как счетчик "n" превысит baseName.length продолжат выполняться предыдущие циклы. Они будут проверять соответствие контента элементов (начиная со второго и до конца) с классом "name", но т.к. n==baseName.length, то искать циклы будут элемент, чей контент равен null. Т.е. условие для элементов с индексом > 1 никогда не выполнится, поскольку строка никогда не будет равна null (равна !== эквивалентна).

Upd. [][1]===undefined, т.е. в тексте выше "null" читайте как "undefined", но сути не меняет.

Прошу прощенья, ошибся чутка, вот правильный код, который я использовал. Сначала не увидел ошибки:

let baseName = "apple,pineapple,translate".split(',')
let i = 0
let n = 0

function start() {
    for (i; i < document.getElementsByClassName('name').length; i++) {
        if (document.getElementsByClassName('name')[i].innerText == baseName[n]) {
            document.getElementsByClassName('name')[i].click()
        }
}

        if (n < baseName.length - 1) {
            i = 0
            n++
            start()
        }
}


Если открыть debugger в начале исполнения фун-и, то она работает хорошо и клик по элементу срабатывает

ksa 15.11.2017 13:26

Цитата:

Сообщение от Nikolay37
Рекурсия нужна для того, чтобы перечислять мои элементы из baseName

Для "перечисления" используют циклы. ;)

ksa 15.11.2017 13:27

Цитата:

Сообщение от Nikolay37
вот правильный код

Полный пример с тегами хтмл мы так и не увидим?

Nikolay37 15.11.2017 15:48

Цитата:

Сообщение от ksa (Сообщение 470148)
Полный пример с тегами хтмл мы так и не увидим?

<div id="items">
<div class="scrollbar">
<div class="item" data-error="" data-bot_id="37" data-price="5336" data-asset_id="12677286778"  data-market_hash_name="M4A1-S | Cyrex (Field-Tested)" data-name="m4a1-s | cyrex (field-tested)">
<a href="steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198418960881A12677286778D13862166415325500362" class="btn-inspect">Inspect</a><span class="price">5,336</span>
<div class="image"><img src="https://steamcommunity-a.akamaihd.net/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpou-6kejhz2v_Nfz5H_uO1gb-Gw_alIITSj3lU8Pp8j-3I4IG721Hh_UM_YmilJY7DegI4Nw7Y8we4wO-9hJG76pzImHsy7ygh7HyMnAv330-QA3A95Q"/></div>
<span class="name">M4A1-S | Cyrex (Field-Tested)</span>
</div>
<div class="item" data-error="" data-bot_id="37" data-price="26460" data-asset_id="12677286746"  data-market_hash_name="AK-47 | Fuel Injector (Well-Worn)" data-name="ak-47 | fuel injector (well-worn)">
<a href="steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198418960881A12677286746D9559139697008051705" class="btn-inspect">Inspect</a><span class="price">26,460</span>
<div class="image"><img src="https://steamcommunity-a.akamaihd.net/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpot7HxfDhnwMzJemkV08-jhIWZlP_1IbzUklRc7cF4n-SPpIr33gS1rkJqYGD7J4GQcQY5aFCG-lHrlO650JLv6ZzMziA2vXMgtmGdwULg8tCd0w"/></div>
<span class="name">AK-47 | Fuel Injector (Well-Worn)</span>
</div>
<div class="item" data-error="" data-bot_id="37" data-price="6090" data-asset_id="12677215278"  data-market_hash_name="M4A4 | 龍王 (Dragon King) (Minimal Wear)" data-name="m4a4 | 龍王 (dragon king) (minimal wear)">
<a href="steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198418960881A12677215278D7254987710742629388" class="btn-inspect">Inspect</a><span class="price">6,090</span>
<div class="image"><img src="https://steamcommunity-a.akamaihd.net/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpou-6kejhjxszFJTwW0924l4WYg-X1P4Tdn2xZ_ItyiO2Yot-n3gztrUduMW6icdWcc1RqM1HR_FfswLu6gZe4tZrNmiBkpGB8smM7Zio1"/></div>
<span class="name">M4A4 | 龍王 (Dragon King) (Minimal Wear)</span>
</div>
<div class="item" data-error="" data-bot_id="37" data-price="79700" data-asset_id="12677151027"  data-market_hash_name="★ Bayonet | Forest DDPAT (Battle-Scarred)" data-name="★ bayonet | forest ddpat (battle-scarred)">
<a href="steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198418960881A12677151027D9430682923177156928" class="btn-inspect">Inspect</a><span class="price">79,700</span>
<div class="image"><img src="https://steamcommunity-a.akamaihd.net/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpotLu8JAllx8zAaAJG6My3gL-DkvbiKvXXz29XucMoibnArY6s2AXn8kRvZW76LYWSJFdoNwrV_1e2yezuhJbqot2Xnvb67xpg"/></div>
<span class="name">★ Bayonet | Forest DDPAT (Battle-Scarred)</span>
</div>
<div class="item" data-error="" data-bot_id="37" data-price="5317" data-asset_id="12676401658"  data-market_hash_name="AK-47 | Orbit Mk01 (Minimal Wear)" data-name="ak-47 | orbit mk01 (minimal wear)">
<a href="steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198418960881A12676401658D9261165439988559703" class="btn-inspect">Inspect</a><span class="price">5,317</span>
<div class="image"><img src="https://steamcommunity-a.akamaihd.net/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpot7HxfDhnwMzJegJB49C5mpnbxsjmNr_ummJW4NE_iL-ZrYj03wLl_hFqNm71cteWdlA5Zl2F-FG-yO_r0cW4uMnMynFl6T5iuyjnxSwaOw"/></div>
<span class="name">AK-47 | Orbit Mk01 (Minimal Wear)</span>
</div>
<div class="item" data-error="" data-bot_id="37" data-price="52140" data-asset_id="12676164519"  data-market_hash_name="★ Shadow Daggers | Scorched (Field-Tested)" data-name="★ shadow daggers | scorched (field-tested)">
<a href="steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198418960881A12676164519D16161770010107986788" class="btn-inspect">Inspect</a><span class="price">52,140</span>
<div class="image"><img src="https://steamcommunity-a.akamaihd.net/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpovbSsLQJfw-bbeQJR_OOylZCbm_LLPr7Vn35cppwl2-vAot6n0Aa3_Uo_amv3dYKcewRsYl7V_QDql-fu15fv75TPznF9-n515DsDCZ4"/></div>
<span class="name">★ Shadow Daggers | Scorched (Field-Tested)</span>
</div>
<div class="item" data-error="" data-bot_id="37" data-price="27660" data-asset_id="12676144964"  data-market_hash_name="AK-47 | Case Hardened (Field-Tested)" data-name="ak-47 | case hardened (field-tested)">
<a href="steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198418960881A12676144964D876729287817217943" class="btn-inspect">Inspect</a><span class="price">27,660</span>
<div class="image"><img src="https://steamcommunity-a.akamaihd.net/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpot7HxfDhhwszHeDFH6OO7kYSCgvq6Yu-EwzsIuZIj3uiY99WmiwGx_kc9Zjr6JYHBIwM5MFHX-Fi9w-u-1Ij84soNG54bQA"/></div>
<span class="name">AK-47 | Case Hardened (Field-Tested)</span>
</div>
<div class="item" data-error="" data-bot_id="37" data-price="23420" data-asset_id="12676074732"  data-market_hash_name="StatTrak™ AWP | Fever Dream (Field-Tested)" data-name="stattrak™ awp | fever dream (field-tested)">


В let baseName = "StatTrak™ AWP | Fever Dream (Field-Tested)".split(',') Любые из имен. (В данном случае беру только 1, но по сути нужно несколько)

Этого достаточно или вообще весь код?

ksa 15.11.2017 16:06

Nikolay37, у тебя извращенное понятие тестового примера. :(

Убери из этого фарша не нужную информацию.


Часовой пояс GMT +3, время: 10:03.