2009-01-06 41 views
26

Tôi vừa phát hiện ra (một cách khó khăn), khi bạn có biểu mẫu HTML với action="", trình duyệt Webkit xử lý nó khác với Firefox và Internet Explorer.Biểu mẫu có hành động = ""

Trong FF và IE, có hai thẻ dưới hình thức là tương đương:

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

<form method="post"> 

Họ sẽ vừa gửi biểu mẫu trở lại cùng một trang. Tuy nhiên, Safari và Chrome sẽ gửi biểu mẫu đầu tiên đó đến trang mặc định (index.php hoặc bất kỳ thứ gì) - biểu mẫu thứ hai hoạt động giống như FF/IE.

Tôi đã nhanh chóng tấn công mã của mình để bất kỳ nơi nào nó thường in một hành động trống, nó không thêm thuộc tính hành động nào cả.

Điều này có vẻ rất lộn xộn và không phải là cách tốt nhất để làm việc. Bất cứ ai có thể đề xuất một phương pháp tốt hơn? Ngoài ra, bất cứ ai có thể khai sáng cho tôi về lý do tại sao Webkit sẽ làm một điều như vậy?

+0

Điều này có/đã được coi là một lỗi chống lại webkit [ở đây] (https://bugs.webkit.org/show_bug.cgi?id=7763) –

Trả lời

6

Cách tốt nhất theo ý kiến ​​của tôi sẽ không bỏ qua thuộc tính hành động (sẽ không xác thực) nhưng để chỉ định hành động thực tế cho biểu mẫu. Có lý do nào bạn không chỉ định hành động không?

+3

đó là một hình thức chung trên nhiều trang, một số trong đó có thể có một loạt các tham số GET. Tôi đã tìm thấy hành động dễ dàng hơn "" nhiều hơn là tạo lại URL và mã hóa nó một cách chính xác. – nickf

+0

Tôi thực sự có một trình trợ giúp phân tích các tham số url và tạo lại nó cho phù hợp, mà tôi sử dụng trong hầu hết các dự án của mình. Bạn đang sử dụng mẫu router? nó thực sự hữu ích nếu URL của bạn có ngữ nghĩa có thể dự đoán được và có thể được chia nhỏ dễ dàng. –

+0

Nếu bạn cho chúng tôi biết thêm một chút về môi trường của bạn, có thể có một câu trả lời cụ thể mà làm cho điều này dễ dàng, ví dụ, trong django, nó thường đủ để có 'action =" {{request.path}} "' để có được cùng một hiệu ứng. – SingleNegationElimination

27

Tôi thường sử dụng

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

Điều này có nghĩa các URL hiện tại nhưng không có thông số.

+1

Tôi làm điều này, ngoại trừ tôi tuân thủ XHTML bằng cách sử dụng các dấu ngoặc kép. =] – strager

+12

Bạn có thể sử dụng dấu nháy đơn và vẫn có XHTML hợp lệ; bạn không phải sử dụng dấu ngoặc kép. –

+2

Ồ, tệ của tôi. Tôi phải hiểu nhầm các tiêu chuẩn hơn. Dù sao, tôi thích doublequotes. – strager

2

Tôi đã luôn luôn được sử dụng (trong PHP)

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

Để có được hình thức của tôi để nộp cho bản thân.

+0

Như tôi đã nói: Sử dụng 'htmlspecialchars()' chứ không phải 'striptags()'! – Gumbo

10

Các action attribute is required nhưng bạn có thể chỉ định một tham chiếu URI trống referes đến URI hiện tại:

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

Sửa Ok, điều này thực sự là một lỗi đệ của WebKit 528+ (xem Bug 19884) khi URI trống được sử dụng với URI cơ sở được chỉ định sử dụng phần tử BASE. Trong trường hợp đó WebKit lấy URI cơ sở thay vì giải quyết URI trống từ URI cơ bản.

Nhưng đây là correct behavior according to RFC 3986:

5,1. Thiết lập URI cơ sở

Thuật ngữ "tương đối" ngụ ý rằng "URI cơ sở" tồn tại dựa vào đó tham chiếu tương đối được áp dụng. […]

URI cơ sở của tham chiếu có thể được thiết lập theo một trong bốn cách, được thảo luận bên dưới theo thứ tự ưu tiên. Thứ tự ưu tiên có thể được nghĩ về mặt lớp, trong đó cơ sở được xác định trong cùng URI có mức ưu tiên cao nhất.Điều này có thể được hình dung đồ họa như sau:

.----------------------------------------------------------. 
    | .----------------------------------------------------. | 
    | | .----------------------------------------------. | | 
    | | | .----------------------------------------. | | | 
    | | | | .----------------------------------. | | | | 
    | | | | |  <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)   | 
    `----------------------------------------------------------' 

Trong trường hợp này các yếu tố BASE với href thuộc tính là một URI cơ sở nhúng trong nội dung. Và URI cơ sở được nhúng trong nội dung có mức ưu tiên cao hơn URI được sử dụng để truy xuất đối tượng. Vì vậy, hành vi WebKit thực sự là hành vi dự kiến ​​theo RFC 3986.

Nhưng in HTML 5 this behavior of an empty URI in form’s action (vẫn còn là một dự thảo) khác với RFC 3986:

Nếu hành động là chuỗi rỗng, chúng ta hãy hành độngdocument's address.

Lưu ý: Bước này là willful violation của RFC 3986, yêu cầu xử lý URL cơ sở tại đây. Vi phạm này được thúc đẩy bởi mong muốn tương thích với nội dung cũ. [RFC3986]

Thẳng thắn mà nói, một nhận xét HTML sau khi ghi chú này trong mã nguồn đọc:

<!-- 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 
--> 

Vì vậy, đây là thay vì một lỗi có nguồn gốc từ Internet Explorer mà đã trở thành một de-facto Tiêu chuẩn.

+0

... ngoại trừ điều đó không hoạt động trong trình duyệt Webkit, như đã đề cập trong OP. – nickf

+0

Ví dụ thứ hai không phải là HTML hợp lệ. – Gumbo

+1

cũng không, nhưng nó thực sự hoạt động, đó là một chút quan trọng hơn. – nickf

Các vấn đề liên quan