javascript - 如何通过双击下拉列表提交值?

标签 javascript greasemonkey html-select double-click

我正在寻找一种使用 Greasemonkey 在下拉列表 ( which is auto-sized ) 中单击两次来提交值的方法。

目标 HTML:

<form method="post">
  <select size="3" name="z_pos_id">
    <option value="2463">Option A</option>
    <option value="2609">Option B</option>
    <option value="3013">Option C</option>
  </select>
  <input type="submit" value="Button">
</form>

此时,我单击选项将其选中,然后单击按钮提交值(按 Enter 也可以)。

但是对于 Greasemonkey 脚本,我想单击选项来选择它,然后再次单击所选选项来提交它。 这可能吗?

最佳答案

处理两次左键单击而不干扰中心单击和右键单击(太多)的一种方法是:

  1. 跟踪是否 <option>mousedown时被选择事件触发。
  2. 确保稍后触发鼠标单击事件时它仍处于选中状态。
  3. 如果两个条件都满足,请提交包含的表单。

为了大大简化代码,这次使用了 jQuery。 See the code in action at jsFiddle.

一个完整的脚本看起来像这样:

// ==UserScript==
// @name     _Activate double-click on select, submits form
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change introduced
    in GM 1.0.   It restores the sandbox.
*/

$("select[name=z_pos_id] option").bind ("mousedown click", handleOptionClicks);

function handleOptionClicks (zEvent) {
    _self                   = handleOptionClicks;
    _self.optionWasSelected = _self.optionWasSelected || false;

    if (zEvent.type == "mousedown") {
        _self.optionWasSelected = zEvent.target.selected;
    }
    else {//zEvent.type == "click"
        if (zEvent.target.selected  &&  _self.optionWasSelected) {
            //-- Double-click, so submit form:
            $(this).parents ("form").submit ();
        }
    }
}
<小时/> <小时/> <小时/>

更新:这是一个也适用于 Chrome 的版本(需要使用脚本注入(inject))。
这假设目标页面还没有 jQuery:

// ==UserScript==
// @name     _Activate double-click on select, submits form
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant    none
// ==/UserScript==

function GM_main ($) {
    $("select[name=z_pos_id] option").bind ("mousedown click", handleOptionClicks);

    function handleOptionClicks (zEvent) {
        _self                   = handleOptionClicks;
        _self.optionWasSelected = _self.optionWasSelected || false;

        if (zEvent.type == "mousedown") {
            _self.optionWasSelected = zEvent.target.selected;
        }
        else {//zEvent.type == "click"
            if (zEvent.target.selected  &&  _self.optionWasSelected) {
                //-- Double-click, so submit form:
                $(this).parents ("form").submit ();
            }
        }
    }
}

add_jQuery (GM_main, "1.7.2");

function add_jQuery (callbackFn, jqVersion) {
    jqVersion       = jqVersion || "1.7.2";
    var D           = document;
    var targ        = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    var scriptNode  = D.createElement ('script');
    scriptNode.src  = 'http://ajax.googleapis.com/ajax/libs/jquery/'
                    + jqVersion
                    + '/jquery.min.js'
                    ;
    scriptNode.addEventListener ("load", function () {
        var scriptNode          = D.createElement ("script");
        scriptNode.textContent  =
            'var gm_jQuery  = jQuery.noConflict (true);\n'
            + '(' + callbackFn.toString () + ')(gm_jQuery);'
        ;
        targ.appendChild (scriptNode);
    }, false);
    targ.appendChild (scriptNode);
}

关于javascript - 如何通过双击下拉列表提交值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12747088/

相关文章:

javascript - 如何在选择标签的更改时切换选定的 true 或 false?

javascript - 根据 optgroup 标签文本过滤选项

javascript - 为什么使用cloneNode()时<select>元素的值会重置?

javascript - 解决失败: { Error: Cannot find module 'npm-watch'

javascript - Greasemonkey 获取所有打开的标签页的名称

javascript - 在 Vuejs 中读取 HTML 响应并将其显示在对话框中

javascript - 将innerHTML 抓取到变量中

javascript - 如何使用 JavaScript 和 HTML5 播放器更改当前播放的 YouTube 视频的播放速度?

JavaScript 更改空表单字段颜色

javascript - ckeditor如何在图片上传后放置<br>