【问题标题】:Select dropdown item with Tampermonkey creates infinite loop使用 Tampermonkey 选择下拉项创建无限循环
【发布时间】:2021-03-09 20:11:58
【问题描述】:

我希望浏览器从第三方网站的菜单中预先选择一些选项(我不控制该网站)。我的 Tampermonkey 代码(注释掉的部分显示了我还尝试了什么):

    // ==UserScript==
// @name         Select account
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Select the correct account and other transaction parameters.
// @author       Sander Heinsalu
// @match        https://somesite.com*
// @icon         https://www.google.com/s2/favicons?domain=tampermonkey.net
// @require      http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require      https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant        none
// ==/UserScript==

(function() {
    'use strict';


    //$("#sometext_id").val("12345").change(); // This creates an infinite loop of selecting the correct dropdown element.
    var once = true;
    if (once){
        $("#sometext_id").val("12345").change(); // Still creates an infinite loop of selecting the correct dropdown element.
        once = false;
    }

    //waitForKeyElements (".format-select:has(span[class='select grid5'])", selectFinickyDropdown); // These and below do not do anything on the website. 
    //waitForKeyElements (".format-select:has(select[id='sometext_id'])", selectFinickyDropdown);
    //waitForKeyElements ("select[id=sometext_id]:has(option[selected='selected'])", selectFinickyDropdown);
    //waitForKeyElements ("select[id=sometext_id]", selectFinickyDropdown);

/*
    //function selectFinickyDropdown (jNode) {
    var jNode = document.evaluate("//option[text().includes('sometext')]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    function selectFinickyDropdown () {
        //var evt = new Event ("click");
        var evt = new Event ("keyup");
        jNode[0].dispatchEvent (evt);
        jNode.val('12345');
        //jNode.text().includes('sometext');
        evt = new Event ("change");
        jNode[0].dispatchEvent (evt);
    }

*/
/*
    var toSelect = "//option[text().includes('sometext')]";
    var matchingElement = document.evaluate(toSelect, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    //document.getElementById("stateSelect").selectedIndex = i;
    //matchingElement.selectedIndex=1;
    matchingElement.selected = true;

*/



})();

选择下拉项的其他方法在网页上没有做任何事情。只有$("#sometext_id").val("12345").change(); 选择了该项目,但在每次重复选择后重复它并刷新页面。 如何选择一个下拉项并停在那里?没有循环或页面刷新。

页面的部分html(编辑过的字段名):

    <input type="hidden" name="i_csrf_token" value="gibberish" id="i_csrf_token"> 
    <div class="message" id="msg-container" style="display:none">
    </div>
        <div class="form-container mt20">
            <div class="field-row ">

                <label for="i_sometext_id" class="req">AText</label> 
                


        <span class="select grid5" style="position: relative; width: 275px;">
        <select name="sometext_id" id="sometext_id" onchange="DoAutopostback(this);" style="width: 100%; visibility: visible;">
        
            <option value="321">
            namex namex • 54321
            </option>
        
            <option value="345" selected="selected">
            optionname • 12345
            </option>
        
        </select>
        <span class="value" style="width: 344px;">
            optionname • 12345
            </span></span>
    
            </div>

            <div class="field-row ">

                <strong class="label">BText</strong> 
                <span class="group">
                    
                        <label class="has-input"><input type="radio" name="i_action_type" id="action_type-1" value="1" class="required" checked="checked">aa</label><br><label class="has-input"><input type="radio" name="i_action_type" id="action_type-2" value="2" class="required">bb</label>
                    
                </span>
            </div>
        
    
    <div class="submit-row">
    
        <span class="submit">
            <button class="button" type="submit">preview</button>
        </span>
    
    </div>
    
    <input type="hidden" name="i_submit" value="1">

相关问题about disabling a function after it runsone()IIFE不适用,因为再次触发Tampermonkey脚本的是页面重载,而Tampermonkey脚本要么触发重载页面要么不起作用。

【问题讨论】:

  • onchange="DoAutopostback(this);" - 我赌的是那个。是不是即使没有 Tampermonkey 的东西(只需完全评论它),当您手动更改选择时,它会重新加载页面?
  • @tevemadar 是的,手动选择也会重新加载页面。
  • 那为什么它与tampermonkey的行为不同呢?
  • 重载的无限循环是问题所在。一次重载就可以了。我想解决方案是仅在过去未重新加载同一页面时才运行 Tampermonkey 代码。有没有办法跟踪页面是否已重新加载?也许带有浏览器会话 ID,也许带有超时。或者替换或禁用DoAutopostback

标签: javascript tampermonkey


【解决方案1】:

https://somesite.com* 更改为https://somesite.com?vi=0 解决了这个问题,因为网站在第一次重新加载后将其网址更改为https://somesite.com,但在初始加载时为https://somesite.com?vi=0。所以网站本身可以帮助我跟踪它的重新加载并相应地更改 Tampermonkey 脚本。

现在的问题是如何从多个下拉菜单中选择项目,如果其中每一个都重新加载站点并且 url 没有跟踪第一个之后的进一步重新加载。脚本不起作用(如果在错误的 url 上调用)或循环(每次重新加载 url 都会再次调用脚本)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多