7

चलो कहते हैं कि मैं/पेज पर हूँ चलो? Id = 1इतिहास में एक ही पृष्ठ के बाद पुन: निर्देशन-मिल (पीआरजी) फिर से आवेषण वेबकिट ब्राउज़रों में

तब मैं/पृष्ठ पर नेविगेट? Id = 2

और मैं उस पृष्ठ पर एक बदलाव करता हूं, जो एक पोस्ट लागू करता है और फिर/पृष्ठ पर रीडायरेक्ट करता है? Id = 2

फ़ायरफ़ॉक्स में, मैं एक बार बैक बटन दबा सकता हूं और/पृष्ठ पर वापस आ सकता हूं? Id = 1, लेकिन आईफोन पर क्रोम और सफारी में, मुझे बैक बटन दो बार हिट करना होगा क्योंकि/पेज? id = 2 ब्राउज़र इतिहास में दो बार है। (और यदि मैंने id = 2 से कई पोस्ट किए हैं, तो मुझे बैक बटन को हिट करना होगा जो अंततः आईडी = 1 पर वापस आ जाएगा।)

कुछ तरीकों से, यह सामान्य ब्राउज़र व्यवहार जैसा लगता है, प्रत्येक के रूप में जीईटी को इतिहास में आसानी से धक्का दिया जाता है, लेकिन चूंकि यूआरएल पिछली प्रविष्टि के समान है, इसलिए इसका परिणाम खराब उपयोगकर्ता अनुभव में होता है, जो आम तौर पर अन्य वेब अनुप्रयोगों से बचा जाता है ... और स्वाभाविक रूप से फ़ायरफ़ॉक्स से बचा जाता है। क्या यह वेबकिट ब्राउज़र में एक अपरिहार्य बग है, या क्या मैं इससे बचने के लिए पीआरजी को एक अलग तरीके से कार्यान्वित कर सकता हूं?

btw- व्यवहार के साथ 302 या 303

अद्यतन एक ही पुन: निर्देशित हो गया लगता है: मैं कुछ नमूना कोड मज़ाक उड़ाया है ... jsfiddle जहां की तरह एक मंच हो, तो पता नहीं है मैं इस अपलोड कर सकते हैं आप कार्रवाई में देखने के लिए:

form.php:

id=<?=$_REQUEST['id']?> 
<form action="submit.php" method="post"> 
<input type="hidden" name="id" value="<?=$_REQUEST['id']?>"> 
<input type="submit" value="submit"> 
</form> 

submit.php:

<?php 
header("Location: form.php?id=" . $_REQUEST['id']); 
die($_REQUEST['id']); 
?> 

अगर मैं form.php पर शुरू होता हूं? Id = 4 (बस इसे ब्राउज़र इतिहास में डालने के लिए) और फिर form.php? Id = 5 पर जाएं और फिर सबमिट करें (जैसे डेटाबेस परिवर्तन निष्पादित करने के लिए) फ़ायरफ़ॉक्स में मुझे प्रत्येक के लिए इतिहास में एक प्रविष्टि मिलती है; क्रोम में मुझे आईडी = 4 के लिए एक प्रविष्टि मिलती है और फिर आईडी = 5 के लिए दो प्रविष्टियां मिलती हैं। व्यवहार में अंतर क्यों? मुझे लगता है कि फ़ायरफ़ॉक्स का व्यवहार बेहतर है, क्योंकि id = 5 से दूर जाने के लिए दो बार पीछे हटना उपयोगकर्ता के प्रति अंतर्ज्ञानी है।

उत्तर

1

हालांकि यह क्या होता है पर कोई स्पष्टीकरण नहीं है, मेरे पास इसके चारों ओर एक तरीका है जिसका उपयोग मैं अपने सभी अनुप्रयोगों में करता हूं। सबसे पहले कुछ कोड:

form.php इस प्रकार दिखाई देगा:

id=<?=$_REQUEST['id']?> 
<form action="submit.php" target="iframe" method="post"> 
    <input type="hidden" name="id" value="<?=$_REQUEST['id']?>"> 
    <input type="submit" value="submit"> 
</form> 

submit.php इस तरह:

<?php 
    header("Location: form.php?id=" . $_REQUEST['id']); 
    die($_REQUEST['id']); 
? 
<script> 
    window.parent.location.reload(); 
</script> 

यह <form> टैग में कुछ अतिरिक्त सामान और एक नया <script> टैग के साथ अपने दस्तावेज़ों है

मैं भी इस तरह दस्तावेज़ में एक iframe कहीं होगा:

<iframe name="iframe"></iframe> 

तो समझाने के लिए। एक नई साइट पर नेविगेट करने के बजाय और हर बार आपको बदलाव करने की आवश्यकता होती है, तो आप अपने मौजूदा दस्तावेज़ में iframe में submit.php लोड कर सकते हैं। इसलिए target="iframe" भाग।

तब iframe लोड हो गया है, जिसका अर्थ है कि परिवर्तन किए गए हैं, आप इन परिवर्तनों को दर्शाने के लिए मूल पृष्ठ को पुनः लोड करते हैं, इसलिए window.parent.location.reload(); भाग। चूंकि पृष्ठ बस पुनः लोड हो रहा है, यह आपके इतिहास में दूसरी प्रविष्टि नहीं रखेगा।

मुझे आशा है कि इस मदद की आप

+0

धन्यवाद। मैं देखता हूं कि यह कैसे काम करता है, लेकिन वाह, सुंदर चौराहे के दृष्टिकोण, एक साधारण फॉर्म सबमिशन के लिए iframes, जावास्क्रिप्ट इत्यादि की आवश्यकता होती है (और उम्मीद है कि ब्राउजर आईफ्रेम के कारण अपने इतिहास को प्रदूषित नहीं करता है)। मुझे अभी भी उम्मीद है कि कोई वेबकिट में मानक पीआरजी के दौरान ब्राउज़र इतिहास व्यवहार के अंतर्निहित यांत्रिकी को संबोधित कर सकता है, और देख सकता है कि इसे संबोधित करने के लिए कोई और प्रत्यक्ष समाधान है या नहीं। – dlo

+0

अच्छी टिप्पणी के लिए धन्यवाद। और हां, मैकेनिक्स वास्तव में कैसे काम करता है इस बारे में वास्तविक स्पष्टीकरण प्राप्त करना अच्छा लगेगा। –

+0

हाँ, मैं एक बार खराब हो गया जब मैंने फ़ायरफ़ॉक्स के बारे में एक प्रश्न पूछा और वास्तव में फ़ायरफ़ॉक्स देव टीम पर मौजूद किसी व्यक्ति ने जवाब दिया। :) – dlo

1

:) हम भी एक ही समस्या का सामना करना और दिनों के लिए शोध के बाद भी मुझे कोई "आसान" समाधान मिल गया। मुझे मिली सबसे नज़दीकी चीज़ यह Webkit Bugzilla ticket थी, जो इसे देखकर बहुत अधिक प्राथमिकता प्रतीत नहीं होती है। जैसा कि आपने बताया है, आईई और फ़ायरफ़ॉक्स ठीक काम करते हैं।

चूंकि हमारे पास एप्लिकेशन में अपना स्वयं का बैक बटन है, इसलिए हम सत्र संग्रहण का उपयोग कर समस्या को हल करने और पेज लोड होने पर इसे जांचने में सक्षम थे।

class DoubleHistoryWorkaround { 

    // key of the attribute we store the URL we where on when clicking on the back button 
    private static comingFromLabel = "comingFromURL"; 
    // key of the attribute of the flag denoting whether we set a valid comingFromURL 
    private static comingFromFlag = "comingFromSet"; 

    constructor() { 
     this.checkLocation(); 
    } 

    /** 
    * Checks the URL we saved in the session and goes a further step back 
    * in the history if the first back button brought us to the same page again. 
    */ 
    private checkLocation() { 
     let doubleEntry : boolean; 
     // have we set a comingFromURL? 
     let comingFromSet = window.sessionStorage.getItem(DoubleHistoryWorkaround.comingFromFlag); 
     if (comingFromSet) { 

      // is the set comingFromURL the same as our current page? 
      let currentURL = window.location.href; 
      let comingFromURL = window.sessionStorage.getItem(DoubleHistoryWorkaround.comingFromLabel); 
      if (currentURL === comingFromURL) { 
       // double history entry detected 
       doubleEntry = true; 

       // before we skip we save our location ourselves, since we might still navigate 
       // to the same page again (in case of triple identical history entries) 
       DoubleHistoryWorkaround.saveLocation(); 

       // skip this page 
       history.back(); 
      } 
     } 

     // reset the location entry unless we just set it ourselves 
     if (!doubleEntry) { 
      this.resetLocation(); 
     } 
    } 

    /** 
    * Saves the current location in the session storage. 
    */ 
    public static saveLocation() { 
     window.sessionStorage.setItem(DoubleHistoryWorkaround.comingFromFlag, "true"); 
     window.sessionStorage.setItem(DoubleHistoryWorkaround.comingFromLabel, window.location.href); 
    } 

    /** 
    * Removes the set location from the session storage. 
    */ 
    private resetLocation() { 
     window.sessionStorage.setItem(DoubleHistoryWorkaround.comingFromFlag, "false"); 
     window.sessionStorage.setItem(DoubleHistoryWorkaround.comingFromLabel, ""); 
    } 
} 

हम DoubleHistoryWorkaround.saveLocation() फोन जब हम अपने आवेदन के वापस बटन क्लिक करें, सत्र प्रविष्टियों checkLocation() द्वारा जाँच की जाती की स्थापना: टाइपप्रति कोड निम्नलिखित है।

संबंधित मुद्दे

 संबंधित मुद्दे