使用JavaScript提交表单/获取HTML而不使用iframe?

时间:2013-12-13 20:12:15

标签: javascript jquery ajax iframe userscripts

上下文 我在一个学生的工作中用Web应用程序转录论文报告。它很旧,我们很遗憾无法更改源代码,也无法直接运行数据库查询。

只有在您提交整个表单后才会检查是否存在唯一ID,除非已完全填写,否则您无法提交。毋庸置疑,这是一个巨大的浪费时间,因为你经常转录整个事情只是为了意识到它是重复的。

目的: 我在下面的用户脚本中启动搜索,搜索唯一ID输入的onblur(noReferenceDeclarant),检查是否有任何匹配(行)并相应地返回。用Greasemonkey运行。搜索表单位于同一域中的另一个页面中。搜索表单不带任何URL参数。

这可以不使用iframe(也许是AJAX)来完成 这是我自己的生产力和工具的工具。同时学习JS。因为我还是一个非常初学者,所以欢迎任何使代码更清晰的提示。

//Adding function to input's blur event
$(document).on ("blur", "#noReferenceDeclarant", isRefNumberExists);

//Vars
var noReferenceDeclarant = '';
var loadCode = 0;
var $searchForm;

//Fonctions
function isRefNumberExists () 
{
    noReferenceDeclarant = $('#noReferenceDeclarant').val();
    loadCode = 0;

    //Make sure there's data in the input before proceeding
    if (noReferenceDeclarant)
    {
            //Build search iframe
            $searchForm = $('<iframe />', {
                name: 'searchWindow',
                src: 'rechercherGriIntranet.do?methode=presenterRechercher',
                id:   'searchWindow',
                width: 0,
                height: 0           
            }).appendTo('body');

            $searchForm.load(searchRefNumber);
    }   
}

function searchRefNumber()
{
    var isExists = false;

    //Check which "load" it is to avoid submit loops
    if (loadCode === 0)
    {
        loadCode = 1;

        //Filling search form with search term
        $(this.contentDocument).find('#noReference').val(noReferenceDeclarant);

        //Set search form preferences
        $(this.contentDocument).find('#typeRapportAss').prop('checked', false);
        $(this.contentDocument).find('#typeRapportAS').prop('checked', false);
        $(this.contentDocument).find('#typeRapportSI').prop('checked', true);
        //Submit the form
        $(this.contentDocument).find('form:first').submit();
    }
    else if (loadCode === 1)
    {
        loadCode = 2;

        //See if there are any tr in the result table. If there are no results, there a thead but no tr.
        var foundReports = $(this.contentDocument).find('.resultatRecherche tr').length;

        if (foundReports > 0)
        {
            if (confirm('A report matching this ID already exists. Do you want to display it?'))
            {
                //Modal window loading the report in an iframe. Not done yet but that's fairly straightforward.
            }
            else
            {
                //Close and return to the form.
            }
        }

    }

    //Reset variables/clean ressources
    delete $searchForm;
    $('#dateRedactionRapport').focus();

}

1 个答案:

答案 0 :(得分:1)

总的来说,我看到了远远更糟糕的代码。

Ajax 可以做到这一点,但是你只需要将AJAX响应放入DOM(最有可能是iframe)。

在这种情况下,我会保留你的方法。我认为这是sanest.j

如果没有完整的上下文,可能有一种方法来清理loadCode - 但你拥有的是相同的并且有效。很多人都称之为semaphore,但这只是一个术语问题。

我唯一真正清理的是建议不要经常调用jQuery对象..

// Many folks recommend that jQuery  variables be named $<something>
var $doc = $(this.contentDocument);


doc.find('#typeRapportAss').prop('checked', false);
$doc.find('#typeRapportAS').prop('checked', false);
$doc.find('#typeRapportSI').prop('checked', true);

如果你想使用jQuery数据结构,你可以创建一个如下所示的'config'对象:

var formValues = {
    typeRapportAs: false,
    typeRapportAS: false,
    typeRapportSI: true
};

然后迭代到(使用for ... in .hasOwnProperty)。

这个项目不需要,你正在做的很好,但它可能是一个学习练习。