سؤال

أنا أبحث عن مكون إضافي لـ jQuery يمكنه الحصول على معلمات URL ودعم سلسلة البحث هذه دون إخراج خطأ JavaScript:"تسلسل URI مشوه".إذا لم يكن هناك مكون إضافي لـ jQuery يدعم هذا، فأنا بحاجة إلى معرفة كيفية تعديله لدعم هذا.

?search=%E6%F8%E5

يجب أن تكون قيمة معلمة URL، عند فك تشفيرها، كما يلي:

æøå

(الشخصيات نرويجية).

ليس لدي إمكانية الوصول إلى الخادم، لذا لا يمكنني تعديل أي شيء عليه.

هل كانت مفيدة؟

المحلول 10

لا يجب عليك استخدام jQuery لشيء مثل هذا!
الطريقة الحديثة هي استخدام وحدات صغيرة قابلة لإعادة الاستخدام من خلال مدير الحزم مثل Bower.

لقد خلقت صغيرة وحدة يمكنه تحليل سلسلة الاستعلام إلى كائن.استخدامه مثل هذا:

// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå

نصائح أخرى

function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}

وفيما يلي ما خلقت من التعليقات هنا، فضلا عن إصلاح الخلل لم تذكر (مثل العودة فعلا لاغية، وليس 'باطلة'):

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

وماذا كنت تريد حقا هو مسج URL محلل المساعد . مع هذا البرنامج المساعد، والحصول على قيمة معلمة URL محددة (لURL الحالي) يبدو مثل هذا:

$.url().param('foo');

إذا كنت تريد كائن مع أسماء المعلمات كمفاتيح والقيم المعلمة كقيم، وكنت مجرد دعوة param() بدون حجة، مثل هذا:

$.url().param();

ويعمل هذه المكتبة أيضا مع عناوين أخرى، وليس فقط التيار واحد:

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

وبما أن هذا هو URL بأكمله تحليل مكتبة، يمكنك أيضا الحصول على معلومات أخرى من URL، مثل ميناء محددة، أو المسار، بروتوكول الخ:

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

ولديها ميزات أخرى أيضا، تحقق من صفحته للحصول على مزيد من مستندات والأمثلة على ذلك.

وبدلا من كتابة محلل URI الخاصة لهذا الغرض المحدد الذي <م> كيندا يعمل في معظم الحالات، استخدم محلل URI الفعلي. اعتمادا على الجواب، ورمز من إجابات أخرى يمكن أن يعود 'null' بدلا من null، لا يعمل مع المعلمات فارغة (?foo=&bar=x)، لا يمكن تحليل وإعادة جميع المعلمات دفعة واحدة، يكرر العمل إذا كان الاستعلام مرارا URL لمعلمات الخ .

استخدم محلل URI الفعلي، لا يخترع الخاصة بك.

لهؤلاء ينفرون إلى مسج، هناك نسخة من البرنامج المساعد وهذا محض JS .

إذا كنت لا تعرف ما هي معلمات URL وتريد الحصول على كائن بالمفاتيح والقيم الموجودة في المعلمات، فيمكنك استخدام هذا:

function getParameters() {
  var searchString = window.location.search.substring(1),
      params = searchString.split("&"),
      hash = {};

  if (searchString == "") return {};
  for (var i = 0; i < params.length; i++) {
    var val = params[i].split("=");
    hash[unescape(val[0])] = unescape(val[1]);
  }
  return hash;
}

استدعاء getParameters() بعنوان URL مثل /posts?date=9/10/11&author=nilbus سيعود:

{
  date:   '9/10/11',
  author: 'nilbus'
}

لن أقوم بتضمين الكود هنا لأنه أبعد ما يكون عن السؤال، لكن weareon.net نشر مكتبة تسمح بمعالجة المعلمات في عنوان URL أيضًا:

يمكنك استخدام المتصفح الأصلي الموقع.بحث ملكية:

function getParameter(paramName) {
  var searchString = window.location.search.substring(1),
      i, val, params = searchString.split("&");

  for (i=0;i<params.length;i++) {
    val = params[i].split("=");
    if (val[0] == paramName) {
      return unescape(val[1]);
    }
  }
  return null;
}

ولكن هناك بعض المكونات الإضافية لـ jQuery التي يمكن أن تساعدك:

على أساس الجواب 999:

function getURLParameter(name) {
    return decodeURIComponent(
        (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
    );  
}

التغييرات:

  • decodeURI() يتم استبداله ب decodeURIComponent()
  • [?|&] تتم إضافته في بداية regexp

وتحتاج إلى إضافة المعلمة ط لجعلها قضية حساسة:

  function getURLParameter(name) {
    return decodeURIComponent(
      (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
    );
  }
$.urlParam = function(name){
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
  return (results !== null) ? results[1] : 0;
}

$.urlParam("key");

على سبيل المثال، دالة تقوم بإرجاع قيمة أي متغير من المعلمات.

function GetURLParameter(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++)
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam)
        {
            return sParameterName[1];
        }
    }
}​

وهذه هي الطريقة التي يمكنك بها استخدام هذه الوظيفة بافتراض أن عنوان URL هو،

"http://example.com/?technology=jquery&blog=jquerybyexample".

var tech = GetURLParameter('technology');
var blog = GetURLParameter('blog');

لذلك في متغير الكود أعلاه، سيكون لـ "tech" "jQuery" كقيمة وسيكون متغير "blog" هو "jquerybyexample".

وبعد قراءة كل من الإجابات انتهى بي الأمر مع هذا الإصدار مع + وظيفة ثانية لاستخدام معلمات كما أعلام

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)','i').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

function isSetURLParameter(name) {
    return (new RegExp('[?|&]' + name + '(?:[=|&|#|;|]|$)','i').exec(location.search) !== null)
}

وهناك الكثير من التعليمات البرمجية عربات التي تجرها الدواب هنا والحلول التعبير العادي بطيئة جدا. لقد وجدت الحل الذي يعمل حتى 20x أسرع من نظيره التعابير المنطقية وبسيط بأناقة:

    /*
    *   @param      string      parameter to return the value of.
    *   @return     string      value of chosen parameter, if found.
    */
    function get_param(return_this)
    {
        return_this = return_this.replace(/\?/ig, "").replace(/=/ig, ""); // Globally replace illegal chars.

        var url = window.location.href;                                   // Get the URL.
        var parameters = url.substring(url.indexOf("?") + 1).split("&");  // Split by "param=value".
        var params = [];                                                  // Array to store individual values.

        for(var i = 0; i < parameters.length; i++)
            if(parameters[i].search(return_this + "=") != -1)
                return parameters[i].substring(parameters[i].indexOf("=") + 1).split("+");

        return "Parameter not found";
    }

console.log(get_param("parameterName"));

والتعبيرات المنتظمة ليست BE-كل ونهاية كل حل، لهذا النوع من المشاكل سلسلة التلاعب بسيطة يمكن أن تعمل على كمية كبيرة أكثر كفاءة. كود المصدر .

<script type="text/javascript">
function getURLParameter(name) {
        return decodeURIComponent(
            (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
        );
    }

</script>

وgetURLParameter(id) أو getURLParameter(Id) يعمل نفسه:)

ومسج البرمجية المتكررة للحصول على المتغيرات الحيوية المخزنة في رابط كمعلمات وتخزينها كمتغيرات جافا سكريبت جاهزة للاستخدام مع البرامج النصية:

$.urlParam = function(name){
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (results==null){
       return null;
    }
    else{
       return results[1] || 0;
    }
}

example.com?param1=name&param2=&id=6

$.urlParam('param1'); // name
$.urlParam('id');        // 6
$.urlParam('param2');   // null

//example params with spaces
http://www.jquery4u.com?city=Gold Coast
console.log($.urlParam('city'));  
//output: Gold%20Coast

console.log(decodeURIComponent($.urlParam('city'))); 
//output: Gold Coast
function getURLParameters(paramName) 
{
        var sURL = window.document.URL.toString();  
    if (sURL.indexOf("?") > 0)
    {
       var arrParams = sURL.split("?");         
       var arrURLParams = arrParams[1].split("&");      
       var arrParamNames = new Array(arrURLParams.length);
       var arrParamValues = new Array(arrURLParams.length);     
       var i = 0;
       for (i=0;i<arrURLParams.length;i++)
       {
        var sParam =  arrURLParams[i].split("=");
        arrParamNames[i] = sParam[0];
        if (sParam[1] != "")
            arrParamValues[i] = unescape(sParam[1]);
        else
            arrParamValues[i] = "No Value";
       }

       for (i=0;i<arrURLParams.length;i++)
       {
                if(arrParamNames[i] == paramName){
            //alert("Param:"+arrParamValues[i]);
                return arrParamValues[i];
             }
       }
       return "No Parameters Found";
    }

}

وأنا خلق وظيفة بسيطة للحصول على معلمة URL في جافا سكريبت من URL مثل هذا:

.....58e/web/viewer.html?page=*17*&getinfo=33


function buildLinkb(param) {
    var val = document.URL;
    var url = val.substr(val.indexOf(param))  
    var n=parseInt(url.replace(param+"=",""));
    alert(n+1); 
}
buildLinkb("page");

وOUTPUT: 18

وفقط في حال كنت الرجال قد عنوان الموقع مثل مضيف محلي / index.xsp؟ و= 1 # شيء وكنت بحاجة للحصول على المعلمة لا تجزئة.

var vars = [], hash, anchor;
var q = document.URL.split('?')[1];
if(q != undefined){
    q = q.split('&');
    for(var i = 0; i < q.length; i++){
        hash = q[i].split('=');
        anchor = hash[1].split('#');
        vars.push(anchor[0]);
        vars[hash[0]] = anchor[0];
    }
}

وتعديل طفيف على الإجابة من طرفpauloppenheim، لأنها سوف لا يعالج بشكل صحيح أسماء المعلمات التي يمكن أن تكون جزءا من أسماء المعلمات الأخرى.

وعلى سبيل المثال: إذا كان لديك "appenv" و "الحياة الفطرية" المعلمات، redeaing قيمة ل "الحياة الفطرية" يمكن البيك اب "appenv" قيمة

والإصلاح:

var urlParamVal = function (name) {
    var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search);
    return result ? decodeURIComponent(result[2]) : "";
};

وهذا قد يساعد.

<script type="text/javascript">
    $(document).ready(function(){
        alert(getParameterByName("third"));
    });
    function getParameterByName(name){
        var url     = document.URL,
            count   = url.indexOf(name);
            sub     = url.substring(count);
            amper   = sub.indexOf("&"); 

        if(amper == "-1"){
            var param = sub.split("=");
            return param[1];
        }else{
            var param = sub.substr(0,amper).split("=");
            return param[1];
        }

    }
</script>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top