javascript - معلم - مميزات الجافا سكريبت




سلسلة استعلام تحليل في JavaScript (8)

ممكن تكرار:
كيف يمكنني الحصول على قيم سلسلة الاستعلام؟

أحتاج إلى تحليل سلسلة الاستعلام www.mysite.com/default.aspx?dest=aboutus.aspx . كيف أحصل على متغير dest في JavaScript؟


أردت وظيفة بسيطة أخذت عنوان URL كمدخل وأعادت خريطة لمعلمات طلب البحث. إذا كنت أريد تحسين هذه الوظيفة ، فسأدعم المعيار لبيانات الصفيف في عنوان URL ، أو المتغيرات المتداخلة.

يجب أن يعمل هذا مرة أخرى ومن أجلها مع وظيفة jQuery.param (qparams).

function getQueryParams(url){
    var qparams = {},
        parts = (url||'').split('?'),
        qparts, qpart,
        i=0;

    if(parts.length <= 1 ){
        return qparams;
    }else{
        qparts = parts[1].split('&');
        for(i in qparts){

            qpart = qparts[i].split('=');
            qparams[decodeURIComponent(qpart[0])] = 
                           decodeURIComponent(qpart[1] || '');
        }
    }

    return qparams;
};

أنا أيضًا! http://jsfiddle.net/drzaus/8EE8k/

(ملاحظة: بدون خيوط متداخلة أو متكررة)

deparam = function (querystring) {
  // remove any preceding url and split
  querystring = querystring.substring(querystring.indexOf('?')+1).split('&');
  var params = {}, pair, d = decodeURIComponent;
  // march and parse
  for (var i = querystring.length - 1; i >= 0; i--) {
    pair = querystring[i].split('=');
    params[d(pair[0])] = d(pair[1] || '');
  }

  return params;
};//--  fn  deparam

والاختبارات:

var tests = {};
tests["simple params"] = "ID=2&first=1&second=b";
tests["full url"] = "http://blah.com/?" + tests["simple params"];
tests['just ?'] = '?' + tests['simple params'];

var $output = document.getElementById('output');
function output(msg) {
  $output.innerHTML += "\n" + Array.prototype.slice.call(arguments, 0).join("\n");
}
$.each(tests, function(msg, test) {
  var q = deparam(test);
  // prompt, querystring, result, reverse
  output(msg, test, JSON.stringify(q), $.param(q));
  output('-------------------');
});

النتائج في:

simple params
ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
full url
http://blah.com/?ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------
just ?
?ID=2&first=1&second=b
{"second":"b","first":"1","ID":"2"}
second=b&first=1&ID=2
-------------------

إلقاء نظرة على هذا الحل . باستخدام وظيفته ، عليك فقط عدم استدعاء gup('dest') للاستيلاء على معلمة عنوان URL.


بعد الاطلاع على تعليقي على الإجابة التي أرسلهاbobby ، إليك الرمز الذي سأستخدمه:

    function parseQuery(str)
        {
        if(typeof str != "string" || str.length == 0) return {};
        var s = str.split("&");
        var s_length = s.length;
        var bit, query = {}, first, second;
        for(var i = 0; i < s_length; i++)
            {
            bit = s[i].split("=");
            first = decodeURIComponent(bit[0]);
            if(first.length == 0) continue;
            second = decodeURIComponent(bit[1]);
            if(typeof query[first] == "undefined") query[first] = second;
            else if(query[first] instanceof Array) query[first].push(second);
            else query[first] = [query[first], second]; 
            }
        return query;
        }

تأخذ هذه التعليمة البرمجية في querystring المتوفرة (كـ 'str') وتقوم بإرجاع كائن. يتم تقسيم السلسلة على جميع مرات و & ، مما يؤدي إلى صفيف. ثم يتم travsersed الصفيف ويتم تقسيم كل عنصر فيه "=". وينتج عن ذلك صفائف فرعية حيث يكون العنصر 0 هو المعلمة والعنصر الأول هو القيمة (أو غير معرفة إذا لم = علامة). يتم تعيين هذه إلى خصائص الكائن ، لذلك على سبيل المثال السلسلة "hello = 1 & another = 2 & something" يتم تحويلها إلى:

{
hello: "1",
another: "2",
something: undefined
}

بالإضافة إلى ذلك ، يشير هذا الرمز إلى تكرار تكرار مثل "hello = 1 & hello = 2" ويحول النتيجة إلى مصفوفة ، على سبيل المثال:

{
hello: ["1", "2"]
}

ستلاحظ أيضًا أنه يتعامل مع الحالات التي لا تستخدم فيها العلامة =. كما يتجاهل ما إذا كان هناك علامة مساواة مباشرة بعد الرمز &.

مبالغة بعض الشيء عن السؤال الأصلي ، ولكن حل قابل لإعادة الاستخدام إذا كنت بحاجة إلى العمل مع querystrings في javascript :)


في ما يلي طريقة سريعة وسهلة لتعديل سلاسل طلبات البحث في جافا سكريبت:

function getQueryVariable(variable) {
    var query = window.location.search.substring(1);
    var vars = query.split('&');
    for (var i = 0; i < vars.length; i++) {
        var pair = vars[i].split('=');
        if (decodeURIComponent(pair[0]) == variable) {
            return decodeURIComponent(pair[1]);
        }
    }
    console.log('Query variable %s not found', variable);
}

الآن قدم طلبًا ل page.html؟ x = مرحبًا :

console.log(getQueryVariable('x'));

كنت أرغب في اختيار ارتباطات محددة ضمن عنصر DOM على الصفحة ، وأرسل هؤلاء المستخدمين إلى صفحة إعادة توجيه على جهاز ضبط الوقت ثم مررهم إلى عنوان URL الأصلي الذي تم النقر عليه. هذه هي الطريقة التي قمت بها باستخدام جافا سكريبت العادية دمج واحدة من الأساليب المذكورة أعلاه.

صفحة مع وصلات: رئيس

  function replaceLinks() {   
var content = document.getElementById('mainContent');
            var nodes = content.getElementsByTagName('a');
        for (var i = 0; i < document.getElementsByTagName('a').length; i++) {
            {
                href = nodes[i].href;
                if (href.indexOf("thisurl.com") != -1) {

                    nodes[i].href="http://www.thisurl.com/redirect.aspx" + "?url=" + nodes[i];
                    nodes[i].target="_blank";

                }
            }
    }
}

الجسم

<body onload="replaceLinks()">

إعادة توجيه صفحة الرأس

   function getQueryVariable(variable) {
        var query = window.location.search.substring(1);
        var vars = query.split('&');
        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split('=');
            if (decodeURIComponent(pair[0]) == variable) {
                return decodeURIComponent(pair[1]);
            }
        }
        console.log('Query variable %s not found', variable);
    }
    function delayer(){
        window.location = getQueryVariable('url')
    }

الجسم

<body onload="setTimeout('delayer()', 1000)">

وماذا عن هذا؟

function getQueryVar(varName){
    // Grab and unescape the query string - appending an '&' keeps the RegExp simple
    // for the sake of this example.
    var queryStr = unescape(window.location.search) + '&';

    // Dynamic replacement RegExp
    var regex = new RegExp('.*?[&\\?]' + varName + '=(.*?)&.*');

    // Apply RegExp to the query string
    val = queryStr.replace(regex, "$1");

    // If the string is the same, we didn't find a match - return false
    return val == queryStr ? false : val;
}

.. ثم فقط نسميها مع:

alert('Var "dest" = ' + getQueryVar('dest'));

في صحتك


يمكنك أيضًا استخدام مكتبة URI.js الممتازة بواسطة Rodney Rehm . إليك الطريقة:-

var qs = URI('www.mysite.com/default.aspx?dest=aboutus.aspx').query(true); // == { dest : 'aboutus.aspx' }
    alert(qs.dest); // == aboutus.aspx

ولتحليل سلسلة الاستعلام من الصفحة الحالية: -

var $_GET = URI(document.URL).query(true); // ala PHP
    alert($_GET['dest']); // == aboutus.aspx 




query-string