ตรวจพบว่าอินพุตมีข้อความอยู่ในนั้นโดยใช้ CSS - บนหน้าที่ฉันกำลังเยี่ยมชมและไม่ได้ควบคุม?


187

มีวิธีตรวจสอบว่าอินพุตมีข้อความอยู่ใน CSS หรือไม่ ฉันลองใช้:emptyคลาสหลอกและฉันลองใช้[value=""]แล้วใช้ไม่ได้ผล ฉันไม่สามารถหาวิธีแก้ไขปัญหานี้ได้

ฉันคิดว่าสิ่งนี้จะต้องเป็นไปได้โดยพิจารณาว่าเรามีคลาสหลอกสำหรับ:checkedและ:indeterminateทั้งสองอย่างนี้เป็นสิ่งที่คล้ายกัน

โปรดทราบ: ฉันกำลังทำสิ่งนี้ในสไตล์ "มีสไตล์"ซึ่งไม่สามารถใช้ JavaScript ได้

โปรดทราบว่ามีการใช้ Stylish, ฝั่งไคลเอ็นต์ในหน้าเว็บที่ผู้ใช้ไม่ได้ควบคุม


ฉันไม่แน่ใจว่าจะทำอย่างไรกับ CSS (ซึ่งไม่อัปเดตทันที) แม้ว่าจะเป็นเรื่องง่ายด้วย JavaScript
ralph.m

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

2
มีความเป็นไปได้ที่ซ้ำกันของ: ไม่ (: ว่าง) ตัวเลือก CSS ไม่ทำงาน
Danny Beckett

คำตอบ:


66

มีสไตล์ไม่สามารถทำได้เพราะ CSS ไม่สามารถทำเช่นนี้ CSS ไม่มีตัวเลือก (หลอก) สำหรับ<input>ค่า ดู:

:emptyเลือกหมายถึงเฉพาะโหนดลูกไม่ได้ค่าที่ป้อนเข้า
[value=""] ไม่ทำงาน แต่สำหรับสถานะเริ่มต้นเท่านั้น นี่เป็นเพราะvalue แอตทริบิวต์ของโหนด(CSS นั้นเห็น) ไม่เหมือนกับvalue คุณสมบัติของโหนด(เปลี่ยนโดยผู้ใช้หรือจาวาสคริปต์ DOM และส่งเป็นข้อมูลแบบฟอร์ม)

หากคุณไม่สนใจสถานะเริ่มต้นเท่านั้นคุณต้องใช้สคริปต์ผู้ใช้หรือสคริปต์ Greasemonkey โชคดีที่มันไม่ยาก สคริปต์ต่อไปนี้จะทำงานใน Chrome หรือ Firefox ที่ติดตั้ง Greasemonkey หรือ Scriptish หรือในเบราว์เซอร์ที่รองรับ userscripts (เช่นเบราว์เซอร์ส่วนใหญ่ยกเว้น IE)

ดูการสาธิตของข้อ จำกัด ของวิธีการแก้ CSS บวกจาวาสคริปต์ที่ที่หน้า jsBin นี้

// ==UserScript==
// @name     _Dynamically style inputs based on whether they are blank.
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

var inpsToMonitor = document.querySelectorAll (
    "form[name='JustCSS'] input[name^='inp']"
);
for (var J = inpsToMonitor.length - 1;  J >= 0;  --J) {
    inpsToMonitor[J].addEventListener ("change",    adjustStyling, false);
    inpsToMonitor[J].addEventListener ("keyup",     adjustStyling, false);
    inpsToMonitor[J].addEventListener ("focus",     adjustStyling, false);
    inpsToMonitor[J].addEventListener ("blur",      adjustStyling, false);
    inpsToMonitor[J].addEventListener ("mousedown", adjustStyling, false);

    //-- Initial update. note that IE support is NOT needed.
    var evt = document.createEvent ("HTMLEvents");
    evt.initEvent ("change", false, true);
    inpsToMonitor[J].dispatchEvent (evt);
}

function adjustStyling (zEvent) {
    var inpVal  = zEvent.target.value;
    if (inpVal  &&  inpVal.replace (/^\s+|\s+$/g, "") )
        zEvent.target.style.background = "lime";
    else
        zEvent.target.style.background = "inherit";
}

ฉันจะดูสิ่งที่ userscript นั้น ขอบคุณ
JacobTheDev

@MartinGottweis ไม่ใช่ในกรณีของ OP ไม่ได้ นี่เป็นคำถาม[มีสไตล์]
Brock Adams

1
@BrockAdams, op บอกว่ามันใช้ javascript ไม่ได้ดังนั้นตัวเลือกที่ถูกต้องเป็นวิธีที่จะไป ฉันพลาดอะไรไปรึเปล่า?
Martin Gottweis

1
@MartinGottweis ที่:validตัวเลือกต้องเขียนใหม่หน้า - ซึ่งเป็นสิ่งที่ OP ไม่สามารถทำอะไรกับสไตล์และไม่มีคำตอบอื่น ๆ ที่แสดงที่ทุกคนในบริบทการเรียกดู ผู้ใช้ไม่สามารถควบคุมหน้าที่เขากำลังเยี่ยมชมได้
Brock Adams

265

เป็นไปได้ด้วย CSS caveats ปกติและหากสามารถแก้ไขโค้ด HTML ได้ หากคุณเพิ่มrequiredคุณสมบัติให้กับองค์ประกอบองค์ประกอบนั้นจะจับคู่:invalidหรือ:validเป็นไปตามค่าของการควบคุมว่างเปล่าหรือไม่ หากองค์ประกอบนั้นไม่มีvalueแอตทริบิวต์ (หรือมีvalue="") ค่าของการควบคุมจะว่างเปล่าในตอนแรกและจะไม่ว่างเปล่าเมื่อมีการป้อนอักขระใด ๆ (แม้แต่ช่องว่าง)

ตัวอย่าง:

<style>
#foo { background: yellow; }
#foo:valid { outline: solid blue 2px; }
#foo:invalid { outline: solid red 2px; }
</style>
<input id=foo required>

pseudo-classed :validและ:invalidถูกกำหนดในเอกสาร CSS ระดับร่างทำงานเท่านั้น แต่การสนับสนุนค่อนข้างแพร่หลายในเบราว์เซอร์ยกเว้นใน IE นั้นมาพร้อมกับ IE 10

หากคุณต้องการให้รวมค่าที่ว่างของช่องว่างเท่านั้นคุณสามารถเพิ่มแอททริบิวต์pattern=.*\S.*ได้

มี (ในปัจจุบัน) ไม่มีตัวเลือก CSS สำหรับการตรวจสอบโดยตรงว่าตัวควบคุมอินพุตมีค่าที่ไม่ว่างเปล่าหรือไม่ดังนั้นเราจึงต้องดำเนินการทางอ้อมดังที่อธิบายไว้ข้างต้น

โดยทั่วไปตัวเลือก CSS อ้างถึงมาร์กอัปหรือในบางกรณีถึงคุณสมบัติองค์ประกอบตามที่กำหนดด้วยการเขียนสคริปต์ (JavaScript ฝั่งไคลเอ็นต์) แทนที่จะเป็นการกระทำของผู้ใช้ ตัวอย่างเช่น:emptyจับคู่องค์ประกอบที่มีเนื้อหาว่างในมาร์กอัป inputองค์ประกอบทั้งหมดจะว่างเปล่าอย่างหลีกเลี่ยงไม่ในแง่นี้ ตัวเลือก[value=""]ทดสอบว่าองค์ประกอบมีvalueคุณสมบัติเป็นมาร์กอัปและมีสตริงที่ว่างเปล่าเป็นค่าหรือไม่ และ:checkedและ:indeterminateมีสิ่งที่คล้ายกัน พวกเขาจะไม่ได้รับผลกระทบจากการป้อนข้อมูลของผู้ใช้จริง


7
นี่คือเป็นทางออกที่ดีและถ้าหากทุกอินพุตเป็น required-- ถ้าไม่วิ่งเข้ามาในสถานการณ์ที่คุณมีช่องใส่ที่ถูกต้องที่ว่างเปล่ายังได้รับผลกระทบโดยมีรูปแบบที่ไม่ถูกต้อง JS น่าจะเป็นผู้ชนะสำหรับการแก้ปัญหานี้
AdamSchuld

7
นี่สกปรก แต่ฉลาดอย่างน่าพิศวง ไม่ใช่วิธีแก้ปัญหาสำหรับคำถาม แต่แน่ใจว่าได้ทำเคล็ดลับสำหรับฉัน
Jan

1
ทางออกที่สกปรก โปรดทราบว่าสิ่งนี้อาจทำให้เกิดปัญหากับการเติมข้อความอัตโนมัติใน Chrome หากคุณพยายามเพิ่มตรรกะการแสดงป้ายกำกับตามหรือถ้าไม่จำเป็นต้องป้อนข้อมูลและแบบฟอร์มมีการตรวจสอบความถูกต้องตามนี้
Artjom Kurapov

1
ความหมายนี้ผิด ดังที่กล่าวไว้ในความคิดเห็นก่อนหน้าอินพุตบางตัวอาจเป็นทางเลือกและrequiredแอตทริบิวต์สามารถป้องกันการส่งแบบฟอร์มได้
Zhenming

1
เพิ่มแอnovalidateททริบิวใน<form>องค์ประกอบเพื่อไม่ต้องกังวลเกี่ยวกับการแสดงผลสีแดงเมื่อฟิลด์ว่างหลังจากเติมหนึ่งครั้ง:<form ... novalidate> <input ... required /> </form>
Alcalyn

228

คุณสามารถใช้:placeholder-shownคลาสหลอก ในทางเทคนิคต้องมีตัวยึดตำแหน่ง แต่คุณสามารถใช้ช่องว่างแทน

input:not(:placeholder-shown) {
  border-color: green;
}

input:placeholder-shown {
  border-color: red;
}
<input placeholder="Text is required" />
<input placeholder=" " value="This one is valid" />
<input placeholder=" " />


10
ไม่รองรับ IE หรือ Firefox แต่อย่างใด ที่มา: caniuse.com/#feat=css-placeholder-shown
Sean Dawson

2
คำตอบที่ยอดเยี่ยม การสนับสนุนเบราว์เซอร์ sucks แต่ถ้าโพลีฟิลล์ออกมา:placeholder-shownสิ่งนี้จะกลายเป็นคำตอบที่ยอมรับได้ requiredวิธีการไม่ได้คำนึงถึงกรณีสวัสดิการบัญชี ควรสังเกตว่าคุณสามารถส่งผ่านช่องว่างไปยังตัวยึดตำแหน่งและวิธีนี้จะยังคงทำงานได้ ความรุ่งโรจน์
corysimmons

5
ข้อเสียอื่น ๆ ของเรื่องนี้คือคุณต้องมีตัวยึดตำแหน่งจริงๆ กล่าวอีกนัยหนึ่งinput:not(:placeholder-shown)จะจับคู่เสมอ<input/>แม้ว่าจะไม่มีค่า
redbmk

5
สำหรับฉันมันใช้งานได้ใน Chrome, Firefox และ Safari ไม่ได้อยู่ใน IE11
J0ANMM

1
@redbmk ตามที่กล่าวไว้ใน corysimmons ควรสังเกตว่าคุณสามารถส่งช่องว่างไปยังตัวยึดตำแหน่งและวิธีนี้จะยังคงใช้งานได้
Naeem Baghi

32
<input onkeyup="this.setAttribute('value', this.value);" />

และ

input[value=""]

จะทำงาน :-)

แก้ไข: http://jsfiddle.net/XwZR2/


24
CSS นั้นคืออะไร? ดูเหมือนว่า HTML และ Javascript (แต่ฉันอาจเข้าใจผิด)
jww

Brook Adams wrote: [value = ""] ใช้งานได้; แต่สำหรับสถานะเริ่มต้นเท่านั้น นี่เป็นเพราะแอตทริบิวต์ค่าของโหนด (CSS นั้นเห็น) ไม่เหมือนกับคุณสมบัติค่าของโหนด (เปลี่ยนโดยผู้ใช้หรือจาวาสคริปต์ DOM และส่งเป็นข้อมูลแบบฟอร์ม) -> ความมหัศจรรย์คือการอัปเดตแอตทริบิวต์ค่าเมื่อมีการเปลี่ยนแปลง: jsfiddle.net/XwZR2
Tom D.

2
@ JánosWeiszไม่มันจะไม่ ตัวจัดการนั้นจะถูกตั้งค่าก่อนที่สคริปต์สามารถจัดการองค์ประกอบนั้นและสามารถทำงานพร้อมกับตัวจัดการที่เพิ่มด้วย addEventListener
Dinoboff

1
เห็นได้ชัดว่า onkeyup ดูแลการป้อนข้อมูลด้วยแป้นพิมพ์เท่านั้น อย่างไรก็ตามอย่าลืมว่าคุณสามารถวางข้อความลงในช่องป้อนข้อมูลโดยใช้เมาส์ ลองทำ: คัดลอกข้อความไปยังคลิปบอร์ดของคุณจากนั้นคลิกขวาที่อินพุตแล้วคลิกวาง ดู CSS ไม่ทำงาน เช่นเดียวกับการลากและวางข้อความในกล่องป้อนข้อมูลด้วยเมาส์ของคุณ
beluga

4
input[value]:not([value=""])- จะดีกว่า. ขอบคุณทุกคน. codepen.io/iegik/pen/ObZpqo
iegik

29

โดยทั่วไปสิ่งที่ทุกคนกำลังมองหาคือ:

หัก

input:focus:required{
    &:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
    &:valid,
    &:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}
}

CSS บริสุทธิ์:

input:focus:required:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
input:focus:required:valid,
input:focus:required:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}

1
เห็นได้ชัดว่าคุณเพียงแค่ใช้วิธีการทำงานและคุณมี 0 คะแนนโหวต WaT?
ProNOOB

5
คำตอบที่ยอดเยี่ยม หลอก: ตัวยึดตำแหน่งที่แสดงคลาสไม่ทำงานใน IE หรือ Edge ดังนั้นจึงไม่ใช่โซลูชันที่สมบูรณ์ แม้ว่าจะถูกสาปแช่งแล้วและมันทำให้ฉันต้องการสังหาร Edge ที่ไม่สนับสนุน IE ฉันยอมรับได้ แต่ Edge? C'mon Microsoft!
Aaron Martin-Colby

2
ไม่ใช่โซลูชัน css ที่แท้จริงหากคุณต้องเพิ่ม "ต้อง" ลงใน html ของคุณ
user1566694

ขอบคุณครับผมหวังเป็นอย่างยิ่งว่าสิ่งนี้จะสูงขึ้นเนื่องจากในความคิดของฉันนี่คือสิ่งที่คนส่วนใหญ่ต้องการจริงๆ
sivi911

19

คุณสามารถใช้placeholderเคล็ดลับตามที่เขียนไว้ข้างต้นโดยไม่มีrequiredฟิลด์

ปัญหาrequiredคือเมื่อคุณเขียนบางอย่างแล้วลบออก - ตอนนี้ข้อมูลจะเป็นสีแดงเป็นส่วนหนึ่งของสเป็ค HTML5 - คุณจะต้องใช้ CSS ตามที่เขียนไว้ด้านบนเพื่อแก้ไข / ลบล้างมัน

คุณสามารถทำสิ่งต่าง ๆ ได้โดยง่าย required

<input type="text" placeholder="filter here" id="mytest" />

CSS

#mytest:placeholder-shown {
/* if placeholder is shown - meaning - no value in input */
  border: black 1px solid;
  color: black;
}
#mytest {
  /* placeholder isn't shown - we have a value in input */
  border: red 1px solid;
  color: red;
}

รหัสของปากกา: https://codepen.io/arlevi/pen/LBgXjZ


1
วิธีนี้เหมาะอย่างยิ่งสำหรับกรณีการใช้งานของฉัน ฉันมีตัวกรองการค้นหาที่มีตัวยึดอยู่แล้วและฉันต้องการให้เส้นขอบของกล่องป้อนข้อมูลถูกเน้นเมื่อมีค่า
Stephen Tuttlebee

9

CSS อย่างง่าย:

input[value]:not([value=""])

รหัสนี้จะใช้ css ที่กำหนดในการโหลดหน้าหากป้อนข้อมูลเต็ม


9
ใช้งานได้กับการโหลดหน้าเว็บเท่านั้น ไม่ใช่การพิมพ์ค่าแบบไดนามิก
Ben Racicot

ควรระบุปัญหาการโหลดหน้ากระดาษไว้อย่างชัดเจนสำหรับคำตอบนี้
Bryce Snyder

6

คุณสามารถจัดรูปแบบinput[type=text]แตกต่างกันไปขึ้นอยู่กับว่าอินพุตมีข้อความหรือไม่โดยการกำหนดสไตล์ให้กับตัวยึดตำแหน่ง นี่ไม่ใช่มาตรฐานอย่างเป็นทางการ ณ จุดนี้ แต่มีการสนับสนุนเบราว์เซอร์ที่กว้าง แต่มีคำนำหน้าที่แตกต่างกัน:

input[type=text] {
    color: red;
}
input[type=text]:-moz-placeholder {
    color: green;
}
input[type=text]::-moz-placeholder {
    color: green;
}
input[type=text]:-ms-input-placeholder {
    color: green;
}
input[type=text]::-webkit-input-placeholder {
    color: green;
}

ตัวอย่าง: http://fiddlesalad.com/scss/input-placeholder-css


FYI สิ่งนี้จัดรูปแบบตัวยึดได้อย่างน่าเชื่อถือ แต่มีตัวยึดแทนเท่านั้น สิ่งนี้จะช่วยให้คุณเห็นภาพลวงตาในการเปลี่ยนสีข้อความ แต่เป็นกรณีนี้โดยค่าเริ่มต้นจะเป็นสีเทาและดำ
John Weisz

CSS ทั้งหมดเป็นภาพลวงตาราคาถูกคุณเปลี่ยนรูปลักษณ์ได้โดยไม่ส่งผลกระทบต่อเนื้อหาจริง :-)
vbraun

นี่คือสิ่งที่ฉันต้องการ ฉันต้องการให้อินพุตเปลี่ยนสไตล์หากมีข้อความเนื่องจากการออกแบบสำหรับตัวยึดตำแหน่งแตกต่างจากสไตล์อินพุต ที่สมบูรณ์แบบ!
Christopher Marshall

สิ่งนี้ใช้ได้กับพื้นหลัง แต่ไม่รวมถึงเส้นขอบ ฉันไม่ได้ขุดลึกลงไปในความพยายามที่จะเปลี่ยนแนวชายแดน
majinnaibu



3

คุณสามารถใช้ประโยชน์จากตัวยึดตำแหน่งและใช้:

input:not(:placeholder-shown) {
  border: 1px solid red;
}

1

เคล็ดลับง่ายๆกับ jQuery และ CSS ไลค์:

JQuery:

$('input[value=""]').addClass('empty');
        $('input').keyup(function(){
            if( $(this).val() == ""){
                $(this).addClass("empty");
            }else{
                $(this).removeClass("empty");
            }
        });

CSS:

input.empty:valid{
        box-shadow: none;
        background-image: none;
        border: 1px solid #000;
    }

    input:invalid,
    input:required {
        box-shadow: 3px 1px 5px rgba(200, 0, 0, 0.85);
        border: 1px solid rgb(200,0,0);
    }




    input:valid{
        box-shadow: none;
        border: 1px solid #0f0;
    }

1

ทำในส่วน HTML เช่นนี้:

<input type="text" name="Example" placeholder="Example" required/>

พารามิเตอร์ที่จำเป็นจะต้องมีข้อความในช่องใส่เพื่อให้ถูกต้อง


สิ่งนี้ไม่ช่วยในการตรวจสอบว่าอินพุตมีข้อความอยู่ในนั้นด้วย CSS หรือไม่ซึ่งเป็นคำถาม
Jukka K. Korpela

ขออภัยจริง ๆ แล้วมันช่วย ... มันทำให้เป็นไปได้ที่จะใช้คลาสหลอกตามที่อธิบายไว้ในคำตอบของฉัน
Jukka K. Korpela

1
นี่เป็นคำถามที่มีสไตล์ - ซึ่งหมายความว่า OP ไม่สามารถควบคุมหรือแก้ไขหน้าเป้าหมายได้ เขาเห็นหน้าลูกค้าฝั่งเดียวเท่านั้น
ม. บร็อคอดัมส์

3
นี่เป็นประโยชน์อย่างยิ่งนี่คือตัวอย่างของสิ่งที่ Xedret กำลังพูดถึง: codepen.io/tolmark12/pen/LsBvf
tolmark

****** <จำเป็นต้องป้อนข้อมูล> && อินพุต: ถูกต้อง {... } ******
FremyCompany

0

ใช่ คุณสามารถทำได้ด้วยแอ็ตทริบิวต์พื้นฐานอย่างง่ายพร้อมตัวเลือกค่า

ใช้ตัวเลือกแอททริบิวต์ที่มีค่าว่างและใช้คุณสมบัติ input[value='']

input[value=''] {
    background: red;
}

-6

นี่เป็นไปไม่ได้กับ css ในการดำเนินการนี้คุณจะต้องใช้ JavaScript (เช่น$("#input").val() == "")


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