ต่อท้าย url และรีเฟรชหน้า


134

ฉันต้องการเขียนจาวาสคริปต์ที่จะต่อท้ายพารามิเตอร์เข้ากับ url ปัจจุบันแล้วรีเฟรชหน้า - ฉันจะทำสิ่งนี้ได้อย่างไร


โซลูชันที่เหมาะสมที่สุดที่ฉันพบ: stackoverflow.com/a/38792165/1783439
nu everest

คำตอบ:


163

สิ่งนี้ควรใช้งานได้ (ไม่ผ่านการทดสอบ!)

var url = window.location.href;    
if (url.indexOf('?') > -1){
   url += '&param=1'
}else{
   url += '?param=1'
}
window.location.href = url;

1
str.search (regex) เร็วกว่า srt.indexOf (str2)
xavierm02

1
และคุณควรยกตัวอย่าง ull ด้วยชื่อตัวแปรและพารามิเตอร์ตัวแปรด้วย encodeURIComponent ()
xavierm02

และในส่วนของ> -1 คุณควรใช้! == -1
xavierm02

8
หนึ่งติดตามสิ่งนี้จะเพิ่มตรรกะบางอย่างได้อย่างไรว่าถ้าพารามิเตอร์มีอยู่แล้วใน url ฉันจะอัปเดตค่าแทนที่จะเพิ่มพารามิเตอร์ใหม่
สมัครเล่น

1
สิ่งนี้จะนำจุดยึด (ค่าแฮช) ออกจาก url หากมีอยู่ @amateur คุณสามารถค้นหาฟังก์ชันที่ทำเช่นนั้นได้ที่นี่: stackoverflow.com/questions/486896/…
Doug Molineux

143

สั้นกว่าคำตอบที่ยอมรับทำแบบเดียวกัน แต่ทำให้เรียบง่าย:

window.location.search += '&param=42';

เราไม่จำเป็นต้องแก้ไข URL ทั้งหมดเพียงแค่สตริงคำค้นหาที่เรียกว่าแอตทริบิวต์การค้นหาของตำแหน่ง

เมื่อคุณกำหนดค่าให้กับแอตทริบิวต์การค้นหาเบราว์เซอร์จะแทรกเครื่องหมายคำถามโดยอัตโนมัติและโหลดหน้าซ้ำ


11
สำหรับกรณีที่คุณรู้ว่านี่เป็นเพียงพารามิเตอร์เดียวคุณยังสามารถตั้งค่าการค้นหาแทนการต่อท้าย:window.location.search = '?param=42';
Dave DuPlantis

1
เยี่ยมมาก !! วิธีที่ถูกต้องง่ายที่สุดและเหมาะสมที่สุด ควรเป็นคำตอบที่ได้รับการยอมรับ
Rohit

จะเกิดอะไรขึ้นถ้า url ของคุณคือ: www.mysite.com ... มันจะไม่ทำให้ url: www.mysite.com & param = 42 ซึ่งจะต้องมี "?" อักขระเนื่องจากเป็นพารามิเตอร์เดียวใน url ฉันชอบคำตอบของ @Shlomi Komemi เพราะครอบคลุมทั้ง 2 สถานการณ์หลัก
greaterKing

1
@greaterKing เบราว์เซอร์จะเพิ่มเครื่องหมายคำถามเมื่อเพิ่มพารามิเตอร์ลงในแอตทริบิวต์การค้นหาของตำแหน่ง ลองใช้ในคอนโซลเบราว์เซอร์ของคุณ
Bo Frederiksen

1
@BoFrederiksen ที่ไม่ดีของฉันคุณถูกต้องแน่นอน ... srry เกี่ยวกับเรื่องนั้น "+ =" ของหยาบ ... พลาดไป +1 จากฉัน
greaterKing

71

คำตอบส่วนใหญ่ในที่นี้แนะนำว่าควรต่อท้ายพารามิเตอร์เข้ากับ URL เช่นข้อมูลโค้ดต่อไปนี้หรือรูปแบบที่คล้ายกัน:

location.href = location.href + "&parameter=" + value;

วิธีนี้จะใช้ได้ดีกับกรณีส่วนใหญ่

อย่างไรก็ตาม

นั่นไม่ใช่วิธีที่ถูกต้องในการต่อท้ายพารามิเตอร์เข้ากับ URL ในความคิดของฉัน

เนื่องจากแนวทางที่แนะนำไม่ได้ทดสอบว่ามีการตั้งค่าพารามิเตอร์ใน URL แล้วหรือไม่หากไม่ระมัดระวังอาจลงเอยด้วย URL ที่ยาวมากโดยมีพารามิเตอร์เดียวกันซ้ำหลายครั้ง เช่น:

https://stackoverflow.com/?&param=1&param=1&param=1&param=1&param=1&param=1&param=1&param=1&param=1

ณ จุดนี้คือจุดเริ่มต้นของปัญหา แนวทางที่แนะนำสามารถและจะสร้าง URL ที่ยาวมากหลังจากรีเฟรชหลาย ๆ หน้าจึงทำให้ URL ไม่ถูกต้อง ไปที่ลิงค์นี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ URL แบบยาวความยาวสูงสุดของ URL ในเบราว์เซอร์ต่างๆคืออะไร?

นี่คือแนวทางที่ฉันแนะนำ:

function URL_add_parameter(url, param, value){
    var hash       = {};
    var parser     = document.createElement('a');

    parser.href    = url;

    var parameters = parser.search.split(/\?|&/);

    for(var i=0; i < parameters.length; i++) {
        if(!parameters[i])
            continue;

        var ary      = parameters[i].split('=');
        hash[ary[0]] = ary[1];
    }

    hash[param] = value;

    var list = [];  
    Object.keys(hash).forEach(function (key) {
        list.push(key + '=' + hash[key]);
    });

    parser.search = '?' + list.join('&');
    return parser.href;
}

ด้วยฟังก์ชั่นนี้คุณจะต้องทำสิ่งต่อไปนี้:

location.href = URL_add_parameter(location.href, 'param', 'value');

1
ทำไมไม่ใช้:if(window.location.search.indexOf('&param=') == -1) {window.location.search += '&param=1';}
538ROMEO

@ SébastienGarcia-Roméoใช่นั่นเป็นแนวทางที่น่าสนใจและใช้ได้จริงอย่างไรก็ตามมีเหตุผลสองประการที่ทำให้ฟังก์ชันถูกตั้งโปรแกรมในลักษณะนั้น 1. เพื่อกำจัดพารามิเตอร์ที่ซ้ำกันที่มีอยู่ 2. เพื่อเขียนทับค่าของพารามิเตอร์ที่มีอยู่ จากมุมมองนี้ตอนนี้การใช้งานindexOfอาจทำให้โค้ดมีความซับซ้อนโดยไม่จำเป็น
59


2
function gotoItem( item ){
    var url = window.location.href;
    var separator = (url.indexOf('?') > -1) ? "&" : "?";
    var qs = "item=" + encodeURIComponent(item);
    window.location.href = url + separator + qs;
}

รุ่นที่เข้ากันได้มากขึ้น

function gotoItem( item ){
    var url = window.location.href;    
    url += (url.indexOf('?') > -1)?"&":"?" + "item=" + encodeURIComponent(item);
    window.location.href = url;
}

1

โปรดตรวจสอบรหัสด้านล่าง:

/*Get current URL*/    
var _url = location.href; 
/*Check if the url already contains ?, if yes append the parameter, else add the parameter*/
_url = ( _url.indexOf('?') !== -1 ) ? _url+'&param='+value : _url+'?param='+value;
/*reload the page */
window.location.href = _url;

1

การแก้ไขข้อบกพร่องเล็กน้อยสำหรับคำตอบที่รอบคอบของ @ yeyo ข้างต้น

เปลี่ยนแปลง:

var parameters = parser.search.split(/\?|&/);

ถึง:

var parameters = parser.search.split(/\?|&amp;/);


กรุณาโพสต์การแก้ไขดังกล่าวในความคิดเห็นหรือเสนอและแก้ไข พวกเขาไม่รับประกันคำตอบแยกต่างหาก
JJ for Transparency และ Monica


0

นอกจากนี้:

window.location.href += (window.location.href.indexOf('?') > -1 ? '&' : '?') + 'param=1'

คำตอบของ Shlomi เพียงเส้นเดียวสามารถใช้งานได้ใน bookmarklets

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.