草庐IT

javascript - 在 ui-dialog-buttonpane 中添加搜索按钮和文本框

coder 2024-07-20 原文

我正在编写一个 greasemonkey 脚本来操作 DOM、查询服务器并在单独的 jquery 对话框中显示结果。 我想为其添加以下两个功能:

  1. 提供一个搜索框,其作用类似于在浏览器上进行简单搜索(即仅搜索 jquery 对话框 的内容并突出显示文本)。
  2. 提供一个文本框,除非用户专门更改它,否则应永久存储其内容以供将来使用用户脚本。

我面临的问题是,我想将这两个都包含在对话框的 ui-dialog-buttonpane 区域中,在关闭按钮的左侧,但我不知道该怎么做。

我所知道的是,我可以使用 window.find()(此处使用 http://www.javascripter.net/faq/searchin.htm)启用浏览器查找功能。

有人可以帮我解决这个问题吗?以下是我现有的 greasemonkey 脚本的代码:

// ==UserScript==
// @name        Query for each URL Asynchronously
// @namespace   SupportScript
// @include     *
// @require     https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @require     https://ajax.googleapis.com/ajax/libs/jquery/ui/1.11.0/jquery-ui.min.js
// @resource    jqUI_CSS  https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/themes/redmond/jquery-ui.css
// @grant       GM_addStyle
// @grant       GM_getResourceText
// @grant       GM_getResourceURL
// @run-at      document-end
// allow pasting
// ==/UserScript==

var snapshotResults = document.evaluate('//a[contains(@href,"http")]/@href', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var windowWidth = $(window).width()-800;
var windowHeight = $(window).height();

var zNode = document.createElement ('input');
zNode.setAttribute ('id', 'SSButton');
zNode.setAttribute( 'type', 'image' );
zNode.setAttribute( 'src', 'http://www.veryicon.com/icon/64/System/Longhorn%20R2/Back%20Button.png');
//zNode.setAttribute( 'src', 'https://dperkins.org/2013/2013-07-24.Icon.2.png');
//zNode.setAttribute( 'src','http://i1043.photobucket.com/albums/b433/suzuki800/Button-Info-icon.png');
document.body.appendChild (zNode);

var batchSize = 10;
var urlsToUpsert = [];
var uniqueHostnameSet = new Set();
var uniqueURLArray = [];
uniqueHostnameSet.add(window.location.hostname);
var finalUrl = window.location.protocol + '//' + window.location.hostname;
uniqueURLArray.push(finalUrl);
for (var iterate = 0; iterate < snapshotResults.snapshotLength; iterate++)
{
    var hrefContent = snapshotResults.snapshotItem(iterate).textContent;
    var regex = /http.*/;
    var href = regex.exec(hrefContent);
    var a = document.createElement('a');
    a.href = href;
    if (!uniqueHostnameSet.has(a.hostname))
    {
        uniqueHostnameSet.add(a.hostname);
        finalUrl = a.protocol + '//' + a.hostname;
        uniqueURLArray.push(finalUrl);
    }
}

var divMain = '<div id="SSOverlayDialog"></div>';
$('body').append(divMain);

$.Coral = function (options) {
    $.extend(options, {
        url: "my URL",
        data: JSON.stringify(options.data),
        dataType: 'json',
        crossDomain: true,
        type: 'POST',
        contentType: 'application/json',
        processData: false,
        headers: {
            'Content-Encoding': 'abc',
            'X-Target': options.operation
        },

        dataFilter: function(data, type) {
            return data || "{}";
        }
    });
    return $.ajax(options);
};

$.GetOperation = function (options) {
    $.extend(options, {
        async: true,
        success: function(data) {
            handleData(data);
        },
        operation: 'opeartion1'
    });
    return $.Coral(options);
};

$.UpsertOperation = function (options) {
    $.extend(options, {
        async: true,
        operation: 'Operation2'
    });
    return $.Coral(options);
};


for (var iterateUniqueURLArray=0; iterateUniqueURLArray<uniqueURLArray.length; iterateUniqueURLArray+=batchSize) {
    var urlList = uniqueURLArray.slice(iterateUniqueURLArray,iterateUniqueURLArray+batchSize);
    try {
        var listOfURLs = {
            storeUrlList: urlList
        };
        var dataGetAttributes = {data: listOfURLs};
        $.GetOperation(dataGetAttributes);
    } catch(e) {
        console.log(e);
    }

}

function handleData (data) {
    var div = '<div id="SSOverlayDialog">';
    var response = JSON.stringify(data);
    var subString = "";
    var startIndex = response.indexOf('{',1);
    var endIndex = response.lastIndexOf('}');
    var responseText = response.substring(startIndex,endIndex);
    var subString = JSON.parse(responseText);
    $.each( subString, function( key, value ) {
        key = JSON.stringify(key);
        div+='<b><i><a style="color:#0645AD" href="'+key.substring(1,key.length-1)+'"><u>' + key.substring(1,key.length-1) + '</u></a></i></b><br><br>';
        if(JSON.stringify(value)==='{}') {
            console.log("Value for URL "+key+" is null.");
            div+='<p>This URL does not exist with Mobius.<span style="color:red" class="urlNotPresent" id ="'+key.substring(1,key.length-1)+'"><u>Click Here</u></span> to submit to Mobius.</p>';
        }
        $.each( value, function( ky, val ) {
            ky = JSON.stringify(ky);
            if (val==null) {
                div += '<p><b>'+ky.substring(1,ky.length-1)+': </b><i>'+val+'</i></p>';
            }
            else{
                val = JSON.stringify(val);
                div += '<p><b>'+ky.substring(1,ky.length-1)+': </b><i>'+val.substring(1,val.length-1)+'</i></p>';
            };
        });
        div+='<br>';
    });
    div += '</div>';
    $('#SSOverlayDialog').append(div);
    $(".urlNotPresent").off('click');
    $(".urlNotPresent").one('click', urlNotPresentFn);
    $(".urlNotPresent").hover(pointerToClick, pointerToDefault);
}

var urlNotPresentFn = function() {
    var url = jQuery(this).attr("id");
    if (urlsToUpsert.length == batchSize-1) {
        urlsToUpsert.push(url);
        var listOfURLs = {
            storeUrlList: urlsToUpsert
        };
        var myOptions = {data: listOfURLs};
        $.UpsertOperation(myOptions);
        urlsToUpsert.length = 0;
    } else {
        urlsToUpsert.push(url);
    };
    console.log(urlsToUpsert);
}

var pointerToClick = function() {
    $(".urlNotPresent").css("cursor", "pointer");
}

var pointerToDefault = function(){
    $(".urlNotPresent").css("cursor", "default");
}

$(window).bind('beforeunload', function() {
    if(urlsToUpsert.length>0) {
        var listOfURLs = {
            storeUrlList: urlsToUpsert
        };
        var myOptions = {data: listOfURLs};
        $.UpsertOperation(myOptions);
        urlsToUpsert.length = 0;
    };
    return ;
});

$('#SSOverlayDialog').dialog({

    autoOpen: false,
    modal: false,
    title: 'Discovered URLs (press "Esc" button to close)',
    position: {
        at: 'right top'
    },
    resizable: false,
    width: windowWidth,
    height: windowHeight,
    open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); },
    zIndex: 11111111,
    buttons: [
    {
        text: 'Close',
        click: function () {
            $(this).dialog('close');
        }
    }
    ]
});

$("#SSButton").click(function() {
    ($("#SSOverlayDialog").dialog("isOpen") == false) ? $("#SSOverlayDialog").dialog("open") : $("#SSOverlayDialog").dialog("close") ;
/*  if ($("#SSOverlayDialog").dialog("isOpen") == false) {
            $("#SSOverlayDialog").dialog("open"),
            $('#SSButton').css({
                'transform': 'rotate(180deg)',
                'transform': 'translate(-windowWidth)'
            });
    } else{
        $("#SSOverlayDialog").dialog("close"),
        $('#SSButton').css({
            'transform': 'initial'
        });
    };*/
});

var jqUI_CssSrc = GM_getResourceText('jqUI_CSS');
jqUI_CssSrc = jqUI_CssSrc.replace(/\.ui-front \{[\s]*z-index:\s100\;[\s]*\}/g,".ui-front \{\n z-index: 20000000 \; \n\}");
GM_addStyle(jqUI_CssSrc);

GM_addStyle ( multilineStr ( function () {/*!
  #SSButton {
    background: none repeat scroll 0% 0% ;
    background-image: none;
    background-repeat: repeat;
    background-attachment: scroll;
    background-position: 0% 0%;
    background-size: auto auto;
    overflow: hidden;
    position: absolute;
    top: 0;
    right: 0;
    z-index: 22222222;
    width: 40px;
    height: 40px;
}
*/} ) );

function multilineStr (multiLineStringFn) {
    var str = multiLineStringFn.toString ();
    str     = str.replace (/^[^\/]+\/\*!?/, '') // Strip function () { /*!
            .replace (/\s*\*\/\s*\}\s*$/, '')   // Strip */ }
            .replace (/\/\/.+$/gm, '') // Double-slash comments wreck CSS. Strip them.
            ;
            return str;
        }

最佳答案

要在 ui-dialog-buttonpane 中包含“关闭”按钮左侧的控件,您可以使用 .ui-dialog-buttonset 上的 .prepend() 函数 像这样的类:

$('.ui-dialog .ui-dialog-buttonset').prepend('<input type="text"/><button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text">Search</span></button>');

您很可能希望为正在使用的特定对话框添加一个选择器,以避免将此控件添加到页面上的任何对话框。根据您的示例,它将是这样的:

$('div[aria-describedby=SSOverlayDialog]').find('.ui-dialog-buttonset').prepend('<input type="text"/><button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text">Search</span></button>');

希望这有助于解决主要问题。 祝你好运!

关于javascript - 在 ui-dialog-buttonpane 中添加搜索按钮和文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30044994/

有关javascript - 在 ui-dialog-buttonpane 中添加搜索按钮和文本框的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  5. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  6. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  7. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

  8. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

  9. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  10. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

随机推荐