2009-01-06 19 views
26

मुझे अभी पता चला है (हार्ड तरीका), जब आपके पास action="" के साथ एक HTML फॉर्म है, तो वेबकिट ब्राउज़र फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर के लिए अलग-अलग व्यवहार करते हैं।कार्रवाई के साथ फॉर्म = ""

एफएफ और IE में, इन दो फ़ॉर्म टैग बराबर हैं:

<form method="post" action=""> 

<form method="post"> 

वे दोनों एक ही पृष्ठ पर वापस प्रपत्र प्रस्तुत करेगा। सफारी और क्रोम हालांकि पहले फॉर्म को डिफ़ॉल्ट पृष्ठ (index.php, या जो कुछ भी) भेज देंगे - दूसरा फॉर्म एफएफ/आईई के समान काम करता है।

मैंने अपने कोड को जल्दी से हैक किया है ताकि कहीं भी यह एक खाली कार्रवाई मुद्रित करे, यह बिल्कुल एक एक्शन विशेषता नहीं जोड़ता है।

यह बहुत गन्दा लगता है और चीजों को करने का सबसे अच्छा तरीका नहीं है। क्या कोई बेहतर तरीका सुझा सकता है? साथ ही, क्या कोई मुझे इस बारे में बता सकता है कि क्यों वेबकिट ऐसी चीज करेगा?

+0

यह वेबकिट [यहां] (https://bugs.webkit.org/show_bug.cgi?id=7763) –

उत्तर

6

मेरी राय में सबसे अच्छा तरीका एक्शन विशेषता (जो मान्य नहीं होगा) को छोड़ना नहीं है बल्कि फॉर्म के लिए वास्तविक कार्रवाई निर्दिष्ट करना है। क्या कोई कारण है कि आप कार्रवाई निर्दिष्ट नहीं कर रहे हैं?

+3

के खिलाफ एक बग के रूप में स्पष्ट रूप से दायर किया गया है/यह एक सामान्य रूप है जो कई पृष्ठों पर है, जिनमें से कुछ जीईटी पैरामीटर की एक श्रृंखला हो सकती है। मुझे URL को फिर से बनाने और इसे ठीक से एन्कोड करने की तुलना में कार्रवाई = "" करना बहुत आसान लगता है। – nickf

+0

मेरे पास वास्तव में एक सहायक है जो यूआरएल पैरामीटर को पार करता है और इसके अनुसार इसे पुन: प्रयास करता है, जिसका उपयोग मैं अपनी अधिकांश परियोजनाओं में करता हूं। क्या आप राउटर पैटर्न का उपयोग कर रहे हैं? यह वास्तव में मदद करता है अगर आपके यूआरएल में अर्थशास्त्र है जो अनुमानित हैं और आसानी से टूटा जा सकता है। –

+0

यदि आप हमें अपने पर्यावरण के बारे में कुछ और बताते हैं, तो एक विशिष्ट उत्तर हो सकता है जो उदाहरण के लिए, डीजेंगो में आसान बनाता है, आमतौर पर 'action = "{{request.path}}" प्राप्त करने के लिए पर्याप्त होता है एक ही प्रभाव। – SingleNegationElimination

27

मैं आमतौर पर उपयोग करने

<form method='POST' action='?'> 

यह वर्तमान URL का मतलब है, लेकिन कोई पैरामीटर के साथ।

+1

मैं ऐसा करता हूं, सिवाय इसके कि मैं डबलक्वाट्स का उपयोग करके एक्सएचटीएमएल के अनुरूप हूं। =] – strager

+12

आप सिंगल कोट्स का उपयोग कर सकते हैं और अभी भी वैध एक्सएचटीएमएल है; आपको डबल कोट्स का उपयोग करने की ज़रूरत नहीं है। –

+2

ओह, मेरा बुरा। मुझे मानकों को गलत समझा जाना चाहिए। वैसे भी, मैं डबलक्वॉट पसंद करते हैं। – strager

2

मैं हमेशा (PHP में)

<form method="post" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?>"> 

का उपयोग किया है खुद को प्रस्तुत करने के लिए मेरी रूपों पाने के लिए।

+0

जैसा कि मैंने पहले ही कहा है: 'htmlspecialchars() 'और' striptags() 'का उपयोग करें! – Gumbo

10

action attribute is required लेकिन आप एक खाली यूआरआई संदर्भ है कि वर्तमान यूआरआई को referes निर्दिष्ट कर सकते हैं:

<form method="POST" action=""> 

संपादित ठीक है, यह वास्तव में वेबकिट के दायर बग (Bug 19884 देखें) 528+ जब BASE तत्व का उपयोग कर निर्दिष्ट यूआरआई के साथ एक खाली यूआरआई का उपयोग किया जाता है। उस स्थिति में वेबकिट आधार यूआरआई से खाली यूआरआई को हल करने के बजाय बेस यूआरआई लेता है।

लेकिन इस correct behavior according to RFC 3986 है:

5,1। बेस यूआरआई

शब्द "रिश्तेदार" का तात्पर्य है कि "बेस यूआरआई" मौजूद है जिसके विरुद्ध संबंधित संदर्भ लागू होता है। [...]

संदर्भ के आधार यूआरआई को चार तरीकों से स्थापित किया जा सकता है, प्राथमिकता के क्रम में नीचे चर्चा की गई। प्राथमिकता का क्रम परतों के संदर्भ में सोचा जा सकता है, जहां सबसे निचले परिभाषित आधार यूआरआई की सर्वोच्च प्राथमिकता है।यह रेखांकन के रूप में निम्नानुसार देखे जा सकते हैं :

.----------------------------------------------------------. 
    | .----------------------------------------------------. | 
    | | .----------------------------------------------. | | 
    | | | .----------------------------------------. | | | 
    | | | | .----------------------------------. | | | | 
    | | | | |  <relative-reference>  | | | | | 
    | | | | `----------------------------------' | | | | 
    | | | | (5.1.1) Base URI embedded in content | | | | 
    | | | `----------------------------------------' | | | 
    | | | (5.1.2) Base URI of the encapsulating entity | | | 
    | | |   (message, representation, or none) | | | 
    | | `----------------------------------------------' | | 
    | | (5.1.3) URI used to retrieve the entity   | | 
    | `----------------------------------------------------' | 
    | (5.1.4) Default Base URI (application-dependent)   | 
    `----------------------------------------------------------' 

इस मामले में href विशेषता के साथ BASE तत्व एक आधार यूआरआई सामग्री में एम्बेडेड है। और सामग्री यूआरआई सामग्री में एम्बेडेडसे अधिक प्राथमिकता है URI इकाई को पुनर्प्राप्त करने के लिए उपयोग किया जाता है।

तो कार्रवाई रिक्त स्ट्रिंग है, कार्रवाई रहने दो: तो वेबकिट के व्यवहार वास्तव में आरएफसी 3986.

लेकिन in HTML 5 this behavior of an empty URI in form’s action (अभी भी एक मसौदा) RFC 3986 से अलग है के अनुसार अपेक्षित व्यवहार है document's address

नोट: यह चरण आरएफसी 3986 के willful violation है, जिसके लिए यहां बेस यूआरएल प्रोसेसिंग की आवश्यकता होगी। यह उल्लंघन विरासत सामग्री के साथ संगतता की इच्छा से प्रेरित है। [RFC3986]

सच कहूं, स्रोत कोड में इस नोट के बाद एक HTML टिप्पणी में लिखा है:

<!-- Don't ask me why. But that's what IE does. It even treats 
action="" differently from action=" " or action="#" (the latter 
two resolve to the base URL, the first one resolves to the doc 
URL). And other browsers concur. It is even required, see e.g. 
    http://bugs.webkit.org/show_bug.cgi?id=7763 
    https://bugzilla.mozilla.org/show_bug.cgi?id=297761 
--> 

तो यह बजाय है एक बग इंटरनेट एक्सप्लोरर से उत्पन्न कि बन गया एक जिस वास्तविक मानक।

+0

... सिवाय इसके कि ओपी में उल्लिखित वेबकिट ब्राउज़र में काम नहीं करता है। – nickf

+0

दूसरा उदाहरण मान्य HTML नहीं है। – Gumbo

+1

अच्छी तरह से नहीं, लेकिन यह वास्तव में काम करता है, जो थोड़ा और महत्वपूर्ण है। – nickf

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