อนุญาตให้ใช้เครื่องหมายคำพูดเดี่ยวใน HTML ได้หรือไม่


146

ฉันเป็นผู้ใช้ครั้งใหญ่ในการใช้เครื่องหมายอัญประกาศคู่ใน PHP เพื่อที่ฉันจะสามารถสอดแทรกตัวแปรได้มากกว่าการต่อสตริง ดังนั้นเมื่อฉันสร้าง HTML ฉันมักจะใช้อัญประกาศเดียวสำหรับการตั้งค่าเขตข้อมูลแท็ก ตัวอย่างเช่น:

$html = "<input type='text' name='address' value='$address'>";

ตอนนี้มันอ่านได้ไกลกว่าฉันมาก

$html = "<input type=\"text\" name=\"address\" value=\"$address\">";

หรือ

$html = '<input type="text" name="address" values="' . $address . '">' ;

จากการค้นหาสั้น ๆ ฉันได้ยินคนพูดว่าเบราว์เซอร์ทุกคำพูดเดียวไม่ได้รับการยอมรับ ดังนั้นฉันจึงสงสัยว่าเบราว์เซอร์ใดที่จะมีปัญหาในการจดจำคำพูด HTML เดี่ยว ๆ ?


คำตอบ:


149

สิ่งนี้คล้ายกับคำพูดเดี่ยวใน HTML กลายเป็นที่นิยมเมื่อใด . อัญประกาศเดี่ยวเกี่ยวกับคุณลักษณะใน HTML และได้รับอนุญาตจากข้อกำหนดเสมอ ฉันไม่คิดว่าเบราว์เซอร์ใด ๆ จะไม่เข้าใจพวกเขา


13
สิ่งหนึ่งที่ฉันต้องพูดถึงคือไคลเอนต์ HTML บางตัว (ไม่ใช่เบราว์เซอร์ที่ไม่จำเป็น) มีปัญหาการใช้งานร่วมกันได้ในการอ้างถึงครั้งเดียว ตัวอย่างหนึ่งที่แปลกคือใน Hotmail ถ้าคุณใช้<img src='cid:xxx' ... />เพื่อแสดงรูปภาพแบบอินไลน์จะไม่ปรากฏเลยเพราะ id เนื้อหาถูกละเว้น คุณต้องใช้ `<img src =" cid: xxx "... /> แทน
Earth Engine

52

ตามที่ระบุไว้โดย PhiLho แม้ว่าจะมีความเชื่อแพร่กระจายอย่างกว้างขวางว่าราคาเดียวไม่ได้รับอนุญาตสำหรับค่าคุณลักษณะ แต่ความเชื่อนั้นผิด

มาตรฐาน XMLอนุญาตให้ทั้งคำพูดเดี่ยวและคู่รอบค่าแอตทริบิวต์

มาตรฐาน XHTML ไม่ได้พูดอะไรที่จะเปลี่ยนแปลงสิ่งนี้ แต่ส่วนที่เกี่ยวข้องซึ่งระบุว่าค่าแอตทริบิวต์ต้องถูกยกมาใช้อัญประกาศคู่ในตัวอย่างซึ่งอาจนำไปสู่ความสับสนนี้ ตัวอย่างนี้เป็นเพียงการชี้ให้เห็นว่าค่าแอตทริบิวต์ใน XHTML ต้องเป็นไปตามมาตรฐานขั้นต่ำสำหรับค่าคุณลักษณะใน XML ซึ่งหมายความว่าพวกเขาจะต้องอ้างอิง (ตรงกันข้ามกับ HTML ธรรมดาที่ไม่สนใจ) แต่ไม่ จำกัด คุณเพียงอย่างเดียว คำพูดคู่

แน่นอนว่าเป็นไปได้เสมอที่คุณจะพบกับเครื่องมือแยกวิเคราะห์ซึ่งไม่ได้มาตรฐาน แต่เมื่อสิ่งนั้นเกิดขึ้นการเดิมพันทั้งหมดจะปิดอยู่ ดังนั้นจึงเป็นการดีที่สุดที่จะปฏิบัติตามข้อกำหนดที่ระบุไว้ นั่นเป็นเหตุผลที่เรามีข้อมูลจำเพาะหลังจากทั้งหมด


2
+1 สำหรับลิงก์ไปยังมาตรฐาน XML ฉันรู้ว่านี่เป็นเธรดเก่า แต่เพื่อความสมบูรณ์ผู้คนควรให้ความสนใจเป็นพิเศษกับข้อกำหนดไวยากรณ์ของAttValueภายในมาตรฐาน หากคุณสามารถอ่าน EBNF (คล้ายกับนิพจน์ทั่วไป) คุณจะเห็นว่ามันช่วยให้สามารถใช้ทั้งเครื่องหมายคำพูดเดี่ยวและคู่เพื่อกำหนดขอบเขตแอตทริบิวต์
daiscog

7
แต่ HTML ใช้ SGML (เป็น XHTML ซึ่งใช้ XML) ดังนั้นการอ้างอิงข้อมูลจำเพาะ XML จึงไม่มีประโยชน์มาก ...
Donal Fellows

ความสับสนที่แท้จริงคือว่าการเสนอราคาเดียวหรือสองครั้งในค่าคุณลักษณะนั้นต้องมีการหลีก ดูเหมือนว่าหากคุณใช้เครื่องหมายคำพูดคู่รอบ ๆ ค่าของแอตทริบิวต์คุณจะต้องหลีกเลี่ยงอัญประกาศ แต่ไม่ใช่เครื่องหมายคำพูดเดี่ยว หากคุณใช้เครื่องหมายคำพูดเดี่ยวรอบ ๆ ค่าของแอตทริบิวต์คุณจะต้องหลีกเลี่ยงคำพูดเดียว แต่ไม่ต้องใส่เครื่องหมายคำพูดคู่ และฉันคิดว่านั่นเป็นจุดรวมของการอนุญาตเช่นกัน หากคุณมีเครื่องหมายคำพูดคู่ในค่าของคุณจำนวนมากคุณสามารถหลีกเลี่ยงการหลีกเลี่ยงพวกเขาโดยใช้เครื่องหมายคำพูดเดี่ยวรอบค่าทั้งหมดและในทางกลับกัน
Triynko

ความจริงของเรื่องนี้คือถ้าคุณใช้โหมดเอกสาร XHTML คุณจะพบกับปัญหาล่าม Javascript ซึ่งมันพยายามบังคับให้ HTML ที่สร้างด้วย Javascript ใช้เครื่องหมายอัญประกาศคู่ ฉันพบปัญหาใน Firefox และ IE เมื่อหลายปีก่อน
2867288

16

ฉันเคยได้ยินคนพูดว่าเบราว์เซอร์ทุก ๆ คำพูดเดียวสำหรับ HTML ไม่เป็นที่รู้จัก

บุคคลนั้นผิด


30
ไม่จำเป็น. ฉันสามารถสร้างเบราว์เซอร์ได้ในเวลาไม่กี่นาทีที่ไม่รู้จักเครื่องหมายคำพูดเดี่ยวสำหรับฟิลด์ HTML แน่นอนว่าจะมีอีกมากที่ไม่รู้จัก ... ; P
Lightness Races ใน Orbit

@LightnessRacesinOrbit "คุณหมายความว่าเบราว์เซอร์นี้ไม่รองรับ CSS ?!"
BadHorsie

... หรือที่สำคัญกว่า "เบราว์เซอร์นั้น (ซึ่งไม่ใช่) คือเนื้อสัตว์ตาย" : P
ToolmakerSteve

@LightnessRacesinOrbit - แต่มีคุณไหม? ดูเหมือนว่าทุกคนมีแรงจูงใจพอที่จะทำให้ทั้งเบราว์เซอร์กำลังจะใส่ในอีก 5 นาทีเพื่อให้ยอมรับคำพูดเดียว
user3413723

7

อย่าเชื่อทุกสิ่งที่คุณเห็นบนอินเทอร์เน็ต ...
ขำ ๆ ฉันเพิ่งตอบบางสิ่งที่คล้ายกับใครบางคนที่ประกาศว่าราคาเดียวไม่ถูกต้องใน XHTML ...

อืมฉันมองไปข้างบนขณะพิมพ์และเห็นว่าอดัมยังเผยแผ่ความเชื่อแบบเดียวกัน หากเขาสามารถยืนยันการยืนยันของฉันได้ฉันจะถอนสิ่งที่ฉันเขียน ... AFAIK, XML นั้นไม่เชื่อเรื่องพระเจ้าและยอมรับคำพูดทั้งสองประเภท ฉันได้ลองและตรวจสอบโดยไม่มีปัญหาหน้า XHTML ด้วยคำพูดเดียวเท่านั้น


4

ปัญหาเดียวคือข้อมูลจะเข้าสู่ฟิลด์ TEXT INPUT พิจารณา

<input value='it's gonna break'/>

เหมือนกับ:

<input value="i say - "this is gonna be trouble" "/>

htmlspecialcharsคุณไม่สามารถหลบหนีออกมาว่าคุณต้องใช้


2
อย่างไรก็ตามคุณสามารถทำได้:<input value='it&apos;s gonna break'/>
rink.attendant.6

4
ฉันคิดว่าเหตุผลที่เรามีตัวเลือกให้ใช้การเสนอราคาเดียวหรือสองครั้งคือการหลีกเลี่ยงการหลีกเลี่ยงอักขระในสถานการณ์นี้ หากคุณมีคำพูดเพียงสองครั้งในค่าของคุณล้อมรอบมันด้วยคำพูดเดียวที่จะหลีกเลี่ยงที่จะหลบหนีราคาคู่ชอบดังนั้น: และในทางกลับกัน:<input value="it's not gonna break"/> <input value='i say - "this is not gonna be trouble"'/>
Triynko

1
@Triynko ถูกต้อง นอกจากนี้: สำหรับเนื้อหาโปรดอย่าใช้ "คำพูดโง่ ๆ " ในตอนแรก แต่ "คำพูดที่พิมพ์ออกมา": แถบของปีเตอร์ไม่ใช่แถบของปีเตอร์ ☞ en.wikipedia.org/wiki/Quotation_mark#Quotation_marks_in_English
Frank Nocke

2

ในขณะที่ฉันกำลังมองหาข้อมูลเกี่ยวกับสิ่งนี้ในสเปครุ่นล่าสุดและฉันใช้เวลาพอสมควรในการค้นหานี่คือ:

จาก

HTML 5.3

ร่างแก้ไข, 18 ตุลาคม 2018

[ ... ]

8.1.2.3 คุณลักษณะ

ไวยากรณ์ค่าแอตทริบิวต์ที่เสนอราคาเดี่ยว

ชื่อแอ็ตทริบิวต์ตามด้วยอักขระเว้นวรรคเป็นศูนย์หรือมากกว่าตามด้วยอักขระเครื่องหมายเท่ากับ U + 003D EQUALS เดียวตามด้วยอักขระเว้นวรรคเป็นศูนย์หรือมากกว่าตามด้วยอักขระ APOSTROPHE อักขระ U + 0027 เดียว (') ตามด้วยค่าแอ็ตทริบิวต์ ซึ่งนอกเหนือจากข้อกำหนดที่ระบุไว้ข้างต้นสำหรับค่าแอตทริบิวต์ต้องไม่มีตัวอักษร U + 0027 APOSTROPHE ตัวอักษร (') ใด ๆ และตามด้วยอักขระ U + 0027 APOSTROPHE ตัวที่สอง (สุดท้าย)

ในตัวอย่างต่อไปนี้แอ็ตทริบิวต์ type ถูกกำหนดด้วยไวยากรณ์ของค่าแอ็ตทริบิวต์ที่อ้างถึงเดี่ยว:

<input type='checkbox'>

หากแอ็ตทริบิวต์ที่ใช้ไวยากรณ์แอ็ตทริบิวต์ที่อ้างถึงเดี่ยวต้องตามด้วยแอ็ตทริบิวต์อื่นดังนั้นจะต้องมีอักขระเว้นวรรคคั่นทั้งสอง

http://w3c.github.io/html/single-page.html#elements-attributes


1

ฉันมักจะใช้อัญประกาศเดี่ยวใน HTML และฉันไม่เคยประสบปัญหามาก่อน


1

ฉันใช้เครื่องหมายคำพูดเดี่ยวในหน้า HTML และฝัง JavaScript ไว้ในนั้นและทำงานได้ดี ผ่านการทดสอบใน IE9, Chrome และ Firefox - ดูเหมือนว่าใช้งานได้ดี

<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
        <title>Bethanie Inc. data : geographically linked</title>
        <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js'></script>
        <script src='https://maps.googleapis.com/maps/api/js?v=3.11&sensor=false' type='text/javascript'></script>
        <script type='text/javascript'> 
        // check DOM Ready
        $(document).ready(function() {
            // execute
            (function() {
                /////////////// Addresses ///////////////////
                var locations = new Array();
                var i = 0;
                locations[i++] = 'L,Riversea: Comp Site1 at Riversea,1 Wallace Lane Mosman Park WA 6012'
                locations[i++] = 'L,Wearne: Comp Site2 at Wearne,1 Gibney St Cottesloe WA 6011'
                locations[i++] = 'L,Beachside:Comp Site3 Beachside,629 Two Rocks Rd Yanchep WA 6035'

                /////// Addresses/////////
                var total_locations = i;
                i = 0;
                console.log('About to look up ' + total_locations + ' locations');
                // map options
                var options = {
                    zoom: 10,
                    center: new google.maps.LatLng(-31.982484, 115.789329),//Bethanie  
                    mapTypeId: google.maps.MapTypeId.ROADMAP,
                    mapTypeControl: true
                };
                // init map
                console.log('Initialise map...');
                var map = new google.maps.Map(document.getElementById('map_canvas'), options);
               // use the Google API to translate addresses to GPS coordinates 
               //(See Limits: https://developers.google.com/maps/documentation/geocoding/#Limits)
                var geocoder = new google.maps.Geocoder();
                if (geocoder) {
                    console.log('Got a new instance of Google Geocoder object');
                    // Call function 'createNextMarker' every second
                    var myVar = window.setInterval(function(){createNextMarker()}, 700);
                    function createNextMarker() {
                        if (i < locations.length) 
                       {
                            var customer = locations[i];
                            var parts = customer.split(','); // split line into parts (fields)
                            var type= parts.splice(0,1);    // type from location line (remove)
                            var name = parts.splice(0,1);    // name from location line(remove)
                            var address =parts.join(',');   // combine remaining parts
                            console.log('Looking up ' + name + ' at address ' + address);
                            geocoder.geocode({ 'address': address }, makeCallback(name, type));
                            i++; // next location in list
                            updateProgressBar(i / total_locations);


                        } else 
                       {
                            console.log('Ready looking up ' + i + ' addresses');
                            window.clearInterval(myVar);
                        }
                    }

                    function makeCallback(name,type) 
                   {
                        var geocodeCallBack = function (results, status) {
                            if (status == google.maps.GeocoderStatus.OK) {
                                var longitude = results[0].geometry.location.lng();
                                var latitude = results[0].geometry.location.lat();
                                console.log('Received result: lat:' + latitude + ' long:' + longitude);
                                var marker = new google.maps.Marker({
                                    position: new google.maps.LatLng(latitude, longitude),
                                    map: map,
                                    title: name + ' : ' + '\r\n' + results[0].formatted_address});// this is display in tool tip/ icon color
                                   if (type=='E')  {marker.setIcon('http://maps.google.com/mapfiles/ms/icons/green-dot.png')};

-1

เมื่อเร็ว ๆ นี้ฉันประสบปัญหากับการเพิ่มประสิทธิภาพ Google Search หากมีเครื่องหมายคำพูดเดียวดูเหมือนว่าจะไม่รวบรวมข้อมูลหน้าเว็บที่เชื่อมโยง


1
นี่เป็นเพียง<a href=''>คุณลักษณะหรือไม่
AntonChanning

-2

... หรือเพียงแค่ใช้ heredocs แล้วคุณไม่จำเป็นต้องกังวลเกี่ยวกับการหลบหนีอะไร ENDแต่


ผมเชื่อว่าคุณจะหมายถึงความสามารถในการ heredoc ใน PHP
DavidRR

ไม่แน่ใจว่าทำไมคำตอบนี้จึงลดลงเนื่องจากบริบทของคำถามเดิม มันไม่ได้ตอบปัญหาราคาอัญประกาศเดี่ยวโดยตรง แต่มันแก้ปัญหาการหลบหนีของ php ซึ่งนำไปสู่ ​​OP นิยมคำพูดเดียวตั้งแต่แรก มันสามารถทำกับตัวอย่างของการใช้งานอย่างไรก็ตาม
AntonChanning

-10

การเสนอราคาเดี่ยวเป็นสิ่งที่ดีสำหรับ HTML แต่ไม่มีการอ้างอิง XHTML ที่ถูกต้องซึ่งอาจเป็นปัญหาหากใครก็ตามที่ใช้เบราว์เซอร์ที่รองรับ XHTML เท่านั้น แต่ไม่ใช่ HTML ฉันไม่เชื่อว่ามีเบราว์เซอร์ใด ๆ อยู่แม้ว่าอาจมีตัวแทนผู้ใช้บางรายที่ต้องการ XHTML ที่เข้มงวด


ส่วนที่แย่กว่านั้นคือคนที่เขียนหน้า HTML แต่ทำเครื่องหมายว่าเป็น XHTML เพราะมัน 'ดีกว่า' โชคดีที่แฟชั่นนี้ดูเหมือนจะลงไป
Javier

4
ฉันไม่เชื่อว่าข้อความนี้เกี่ยวกับ XHTML นั้นเป็นจริง ทั้งสอง "และ 'เป็นที่ยอมรับในรูปแบบ XML และตรวจสอบ W3C ยอมรับเอกสาร XHTML ที่มีคุณลักษณะเดียวที่ยกมาบางทีนี่อาจเป็นความสับสนกับ XHTML ขจัดแอตทริบิวต์ unquoted ซึ่งถูกต้องตามกฎหมายใน HTML ได้.?
ดั๊กแม็คคลีน

หากคุณไม่ได้ใช้หน้าเป็นข้อความ / xhtml และไม่ใช่เบราว์เซอร์ข้อความ / html จะแสดงผลเป็น HTML ดังนั้นจะใช้กฎ HTML ไม่ว่าอย่างใดอย่างหนึ่งเกี่ยวกับหลักการของ W3C ไม่ใช่เพื่อทำลายเว็บ เพราะมันใช้งานได้ในตอนนี้มันจะทำงานได้ในวันพรุ่งนี้
Diodeus - James MacFarlane

8
XHTML ต้องการหน้าเป็นรูปแบบ XML ที่ดีและ XML อนุญาตให้ใช้อัญประกาศคู่หรือเดี่ยวรอบแอตทริบิวต์
Ned Batchelder

@SoftwareMonkey จริงๆแล้วคุณต้องการหรือapplication/xhtml+xml application/xml
rink.attendant.6
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.