HTML - ฉันจะแสดงคำแนะนำเครื่องมือได้เฉพาะเมื่อเปิดใช้งานจุดไข่ปลา


205

ฉันมีช่วงข้อมูลแบบไดนามิกในหน้าของฉันอย่างมีellipsisสไตล์

.my-class
{
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;  
  width: 71px;
}
<span id="myId" class="my-class"></span>
document.getElementById('myId').innerText = "...";

ฉันต้องการเพิ่มคำแนะนำเครื่องมือองค์ประกอบนี้ด้วยเนื้อหาเดียวกัน แต่ฉันต้องการให้ปรากฏเฉพาะเมื่อเนื้อหามีความยาวและจุดไข่ปลาปรากฏบนหน้าจอ

มีวิธีใดบ้างที่จะทำ?
เบราว์เซอร์โยนเหตุการณ์เมื่อellipsisเปิดใช้งานหรือไม่

* เบราว์เซอร์: Internet Explorer


1
โปรดทราบว่าtext-overflow:ellipsis;ไม่สามารถใช้งานได้กับ Firefox - ดูคำถามนี้เพิ่มเติม: stackoverflow.com/questions/4927257/ …
Spudley

2
ฉันแค่ต้องทำสิ่งที่คล้ายกัน ตรวจสอบว่าelement.offsetWidth < element.scrollWidthตามคำตอบนี้ดูเหมือนว่าจะทำงานจนถึง
Martin Smith

การตรวจหาจุดไข่ปลา: stackoverflow.com/questions/7738117/…
Adrien เป็น

7
หมายเหตุสำหรับคนรุ่นหลัง: text-overflow:ellipsis;ตอนนี้ใช้งานได้ใน Firefox มันถูกเพิ่มเข้ามาใน Firefox 7 (เผยแพร่เมื่อเดือนกันยายน 2554)
sleske

คำตอบ:


161

นี่คือวิธีที่ใช้การตั้งค่าจุดไข่ปลาในตัวและเพิ่มการสร้างtitleแอตทริบิวต์แบบออนดีมานด์ (พร้อม jQuery) ตามความคิดเห็นของ Martin Smith:

$('.mightOverflow').bind('mouseenter', function(){
    var $this = $(this);

    if(this.offsetWidth < this.scrollWidth && !$this.attr('title')){
        $this.attr('title', $this.text());
    }
});

4
ขอบคุณทำงานเหมือนจับใจ! อย่างไรก็ตามหากคุณต้องการให้มีประสิทธิภาพมากขึ้นคุณอาจลองเปลี่ยนการผูก () ด้วย on () เช่น: $ (document) .on ('mouseenter', '.mightOverflow', function () {... });
Ziad

17
หากคุณต้องการให้ลบคำแนะนำเครื่องมือโดยอัตโนมัติหากข้อความไม่มีการแก้ไขมากเกินไป: $ (document) .on ('mouseenter', '.mightOverflow', function () {var $ t = $ (this); var title = $ t.attr ('title'); if (! title) {if (this.offsetWidth <this.scrollWidth) $ t.attr ('title', $ t.text ())} อื่น {ถ้า (this.offsetWidth> = this.scrollWidth && title == $ t.text ()) $ t.removeAttr ('ชื่อ')}});
Chris Janssen

1
mouseenter เป็นเหตุการณ์ที่เราผูกหรือฟัง เราไม่จำเป็นต้องเพิ่มคำแนะนำเครื่องมือลงในองค์ประกอบจนกว่าจะมีใครบางคนโกรธมากกว่าพวกเขา ดังนั้นเราจึงเลื่อนการเพิ่มไปจนถึงจุดของ mouseenter ในองค์ประกอบ DOM ใด ๆ ที่มีคลาส "mightoverflow" คำแนะนำเครื่องมือแบบ
ทัน

2
"As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document"สำหรับข้อมูลเพิ่มเติมดูapi.jquery.com/bindและapi.jquery.com/on
Adrien Be

2
มันไม่ทำงานบน IE10 - offsetWidth เหมือนกับ scrollWidth ทั้งสองให้ความกว้างที่ถูกตัดทอน
SsjCosty

59

นี่คือโซลูชัน CSS ที่แท้จริง ไม่จำเป็นต้องใช้ jQuery มันจะไม่แสดงคำแนะนำเครื่องมือ แต่มันจะขยายเนื้อหาให้เต็มความยาวเมื่อวางเมาส์ไว้

ใช้งานได้ดีถ้าคุณมีเนื้อหาที่ถูกแทนที่ จากนั้นคุณไม่จำเป็นต้องเรียกใช้ฟังก์ชัน jQuery ทุกครั้ง

.might-overflow {
    text-overflow: ellipsis;
    overflow : hidden;
    white-space: nowrap;
}

.might-overflow:hover {
    text-overflow: clip;
    white-space: normal;
    word-break: break-all;
}

18
มันไม่ดีเท่าคำแนะนำเครื่องมือเพราะอาจทำให้เลย์เอาต์เสียหาย
Alexander

2
ปัญหาเกี่ยวกับเคล็ดลับเครื่องมือคือพวกเขาไม่ทำงานบนมือถืออย่างน้อยตอนนี้ คำตอบนี้สามารถ (อ่าน: อาจจะ) แบ่งเค้าโครง แต่มันสามารถปรับให้เข้ากับตัวอย่างเช่นมีสีพื้นหลังที่แตกต่างกันสำหรับองค์ประกอบ hovered ยังไม่สามารถใช้งานได้บนมือถือ แต่เป็นอีกตัวเลือกหนึ่งสำหรับเดสก์ท็อป
trysis

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

2
มันเป็นคำตอบที่ดีดีกว่า bloating javascript ในปัญหา css ชัดเจนว่าจุดไข่ปลาควรมีตัวเลือกชื่อเรื่องอัตโนมัติวิธีที่ใช้ในขณะนี้ยังขาดความรู้สึก css ที่แย่มากไม่อนุญาตให้ใช้เฉพาะ: โฮเวอร์หากอักขระตัวสุดท้ายคือ '... '
John

32

คำตอบของ uosɐſ นั้นถูกต้อง แต่คุณอาจไม่ต้องการทำในเหตุการณ์ของ mouseenter นั่นจะเป็นสาเหตุให้ทำการคำนวณเพื่อตรวจสอบว่าจำเป็นหรือไม่ทุกครั้งที่คุณเลื่อนเมาส์ไปที่องค์ประกอบ ถ้าไม่มีการเปลี่ยนแปลงขนาดขององค์ประกอบก็ไม่มีเหตุผลที่จะทำเช่นนั้น

มันจะดีกว่าที่จะเรียกรหัสนี้ทันทีหลังจากองค์ประกอบถูกเพิ่มไปยัง DOM:

var $ele = $('#mightOverflow');
var ele = $ele.eq(0);
if (ele.offsetWidth < ele.scrollWidth)
    $ele.attr('title', $ele.text());

หรือถ้าคุณไม่ทราบว่าเมื่อมันถูกเพิ่มอย่างแน่นอนแล้วเรียกรหัสนั้นหลังจากโหลดหน้าเสร็จ

หากคุณมีมากกว่าหนึ่งองค์ประกอบที่คุณต้องทำด้วยคุณสามารถให้คลาสเดียวกันทั้งหมด (เช่น "mightOverflow") และใช้รหัสนี้เพื่ออัปเดตทั้งหมด:

$('.mightOverflow').each(function() {
    var $ele = $(this);
    if (this.offsetWidth < this.scrollWidth)
        $ele.attr('title', $ele.text());
});

+1 การโหลดหน้าเว็บนั้นดูเรียบง่ายขึ้น แต่ก็มีความเป็นไปได้มากกว่า กล่าวคือ คุณอาจต้องการสไตล์องค์ประกอบนี้ที่มีคำแนะนำเครื่องมือที่มีขีดเส้นใต้เพื่อ "สัญญาณ" คำแนะนำเครื่องมือ เช่น$(".mightOverflow").each(function() { if( $(this).offsetWidth < $(this).scrollWidth && !$(this).attr('title')){ $(this).attr('title', $(this).text()); $(this).css('border-bottom', '1px dotted #A8A8A8'); } });
Adrien Be

'ทุกครั้งที่คุณเลื่อนเมาส์ไป' ผิด (ตอนนี้อย่างน้อย - ฉันไม่รู้ว่าคำตอบได้รับการอัปเดตหรือไม่) ตรวจสอบว่าได้คำนวณก่อนหน้านี้แล้วหรือไม่ & $ $ this.attr ('ชื่อ') '
Rune Jeppesen

ไม่นั่นเป็นเพียงการป้องกันไม่ให้เพิ่มแอตทริบิวต์ชื่ออีกครั้ง การคำนวณเพื่อตรวจสอบว่ามันจำเป็นยังคงทำอยู่ this.offsetWidth < this.scrollWidthและอาจถึงแม้การตรวจสอบ!$this.attr('title')จะดำเนินการทุกครั้งที่คุณเลื่อนเมาส์ไปที่องค์ประกอบ
Elezar

9
ปัญหาด้วยวิธีนี้คือการตรวจสอบองค์ประกอบทั้งหมดในครั้งเดียว (อาจส่งผลกระทบต่อประสิทธิภาพการทำงาน) และจะคำนวณเพียงครั้งเดียวดังนั้นหากผู้ใช้ลดขนาดเบราว์เซอร์ที่ทำให้สิ่งต่าง ๆ ถูกตัดทอนหรือขยายออกจะไม่ถูกตัดทอนอีกต่อไป อัปเดตการปรากฏตัวของคำแนะนำเครื่องมือ การแนบรหัสของคุณกับการปรับขนาดหน้าต่างอีกครั้งจะทำให้เกิดปัญหาประสิทธิภาพเนื่องจากทุกรายการตรวจสอบขนาด โดยใช้คณะผู้แทนเหตุการณ์ "$ (เอกสาร) .on ( 'mouseenter', '.mightOverflow' ..." และล่าช้าในการตรวจสอบจนคุณวางเมาส์องค์ประกอบคุณสามารถปรับปรุงได้ทันทีและมีเพียง 1 ตรวจสอบองค์ประกอบ @ เวลา
Chris Janssen

มันไม่ทำงานบน IE10 - offsetWidth เหมือนกับ scrollWidth ทั้งสองให้ความกว้างที่ถูกตัดทอน
SsjCosty

18

ต่อไปนี้เป็นอีกสองโซลูชั่น CSS ที่บริสุทธิ์:

  1. แสดงข้อความที่ถูกตัดทอนในสถานที่:

.overflow {
  overflow: hidden;
  -ms-text-overflow: ellipsis;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.overflow:hover {
  overflow: visible;
}

.overflow:hover span {
  position: relative;
  background-color: white;

  box-shadow: 0 0 4px 0 black;
  border-radius: 1px;
}
<div>
  <span class="overflow" style="float: left; width: 50px">
    <span>Long text that might overflow.</span>
  </span>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad recusandae perspiciatis accusantium quas aut explicabo ab. Doloremque quam eos, alias dolore, iusto pariatur earum, ullam, quidem dolores deleniti perspiciatis omnis.
</div>

  1. แสดง "คำแนะนำเครื่องมือ" ตามอำเภอใจ :

.wrap {
  position: relative;
}

.overflow {
  white-space: nowrap; 
  overflow: hidden;
  text-overflow: ellipsis;
  
  pointer-events:none;
}

.overflow:after {
  content:"";
  display: block;
  position: absolute;
  top: 0;
  right: 0;
  width: 20px;
  height: 15px;
  z-index: 1;
  border: 1px solid red; /* for visualization only */
  pointer-events:initial;

}

.overflow:hover:after{
  cursor: pointer;
}

.tooltip {
  /* visibility: hidden; */
  display: none;
  position: absolute;
  top: 10;
  left: 0;
  background-color: #fff;
  padding: 10px;
  -webkit-box-shadow: 0 0 50px 0 rgba(0,0,0,0.3);
  opacity: 0;
  transition: opacity 0.5s ease;
}


.overflow:hover + .tooltip {
  /*visibility: visible; */
  display: initial;
  transition: opacity 0.5s ease;
  opacity: 1;
}
<div>
  <span class="wrap">
    <span class="overflow" style="float: left; width: 50px">Long text that might overflow</span>
    <span class='tooltip'>Long text that might overflow.</span>
  </span>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad recusandae perspiciatis accusantium quas aut explicabo ab. Doloremque quam eos, alias dolore, iusto pariatur earum, ullam, quidem dolores deleniti perspiciatis omnis.
</div>


นี่คือสิ่งที่ฉันกำลังมองหา!
Praneet Nadkar

ทางออกที่ดีเยี่ยมสิ่งที่ฉันต้องการ ขอบคุณ !
Agu V

17

นี่คือปลั๊กอิน jQuery ของฉัน:

(function($) {
    'use strict';
    $.fn.tooltipOnOverflow = function() {
        $(this).on("mouseenter", function() {
            if (this.offsetWidth < this.scrollWidth) {
                $(this).attr('title', $(this).text());
            } else {
                $(this).removeAttr("title");
            }
        });
    };
})(jQuery);

การใช้งาน:

$("td, th").tooltipOnOverflow();

แก้ไข:

ฉันทำส่วนสำคัญสำหรับปลั๊กอินนี้ https://gist.github.com/UziTech/d45102cdffb1039d4415


1
มันไม่ทำงานบน IE10 - offsetWidth เหมือนกับ scrollWidth ทั้งสองให้ความกว้างที่ถูกตัดทอน
SsjCosty

@SsjCosty ทำไมคุณถึงทดสอบกับ IE 10 ไม่ควรมีใครใช้ IE 10 ในตอนนี้เนื่องจากใครก็ตามที่สามารถติดตั้ง IE 10 สามารถติดตั้ง IE 11 ได้
Tony Brix

อ่าเรามีนโยบายของ บริษัท ที่สนับสนุน IE เวอร์ชันต่ำสุดของเราคือ 10 และเพราะลูกค้าของเราจำนวนมาก (ธนาคารบางแห่งและสถาบันต่าง ๆ ) ยังคงใช้ IE10 โอ้ดี
SsjCosty

12

เราจำเป็นต้องตรวจสอบว่ามีการใช้จุดไข่ปลาจริงๆหรือไม่จากนั้นแสดงคำแนะนำเครื่องมือเพื่อเปิดเผยข้อความเต็ม ไม่เพียงพอโดยการเปรียบเทียบเท่านั้น "this.offsetWidth < this.scrollWidth " เมื่อองค์ประกอบใกล้เนื้อหาเท่านั้น แต่ขาดความกว้างของพิกเซลหนึ่งหรือสองโดยเฉพาะอย่างยิ่งสำหรับข้อความที่มีอักขระจีน / ญี่ปุ่น / เกาหลีแบบเต็มความกว้าง

นี่คือตัวอย่าง: http://jsfiddle.net/28r5D/5/

ฉันพบวิธีปรับปรุงการตรวจหาจุดไข่ปลา:

  1. เปรียบเทียบ "this.offsetWidth < this.scrollWidth " ก่อนอื่นให้ทำตามขั้นตอนที่ 2 หากล้มเหลว
  2. เปลี่ยนสไตล์ css ชั่วคราวเป็น {'ล้น': 'มองเห็นได้', 'พื้นที่สีขาว': 'ปกติ', 'แบ่งคำ': 'หยุดพักทั้งหมด'}
  3. ให้เบราว์เซอร์ทำการรีเลย์ หากการตัดคำเกิดขึ้นองค์ประกอบจะขยายความสูงของมันซึ่งหมายความว่าจุดไข่ปลาจำเป็นต้องมี
  4. กู้คืนสไตล์ css

นี่คือการปรับปรุงของฉัน: http://jsfiddle.net/28r5D/6/


10

ฉันสร้างปลั๊กอิน jQuery ที่ใช้คำแนะนำเครื่องมือของ Bootstrap แทนคำแนะนำเครื่องมือในตัวของเบราว์เซอร์ โปรดทราบว่านี่ยังไม่ได้ทดสอบกับเบราว์เซอร์รุ่นเก่า

JSFiddle: https://jsfiddle.net/0bhsoavy/4/

$.fn.tooltipOnOverflow = function(options) {
    $(this).on("mouseenter", function() {
    if (this.offsetWidth < this.scrollWidth) {
        options = options || { placement: "auto"}
        options.title = $(this).text();
      $(this).tooltip(options);
      $(this).tooltip("show");
    } else {
      if ($(this).data("bs.tooltip")) {
        $tooltip.tooltip("hide");
        $tooltip.removeData("bs.tooltip");
      }
    }
  });
};

เรียบง่ายและยอดเยี่ยม ขอบคุณ!
GumZ

3

นี่คือสิ่งที่ฉันทำ สคริปต์เคล็ดลับเครื่องมือส่วนใหญ่ต้องการให้คุณเรียกใช้งานฟังก์ชันที่จัดเก็บเคล็ดลับเครื่องมือ นี่คือตัวอย่าง jQuery:

$.when($('*').filter(function() {
   return $(this).css('text-overflow') == 'ellipsis';
}).each(function() {
   if (this.offsetWidth < this.scrollWidth && !$(this).attr('title')) {
      $(this).attr('title', $(this).text());
   }
})).done(function(){ 
   setupTooltip();
});

หากคุณไม่ต้องการตรวจสอบจุดไข่ปลา CSS คุณสามารถลดความซับซ้อนเช่น:

$.when($('*').filter(function() {
   return (this.offsetWidth < this.scrollWidth && !$(this).attr('title'));
}).each(function() {
   $(this).attr('title', $(this).text());
})).done(function(){ 
   setupTooltip();
});

ฉันมี "เมื่อ" รอบ ๆ เพื่อให้ฟังก์ชั่น "setupTooltip" ไม่ทำงานจนกว่าชื่อทั้งหมดจะได้รับการปรับปรุง แทนที่ "setupTooltip" ด้วยฟังก์ชัน tooltip ของคุณและ * ด้วยองค์ประกอบที่คุณต้องการตรวจสอบ * จะผ่านพวกเขาทั้งหมดถ้าคุณปล่อยไว้

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

$('*').filter(function() {
   return $(this).css('text-overflow') == 'ellipsis';
}).each(function() {
   if (this.offsetWidth < this.scrollWidth && !$(this).attr('title')) {
      $(this).attr('title', $(this).text());
   }
});

หรือไม่มีการตรวจสอบจุดไข่ปลา:

$.when($('*').filter(function() {
   return (this.offsetWidth < this.scrollWidth && !$(this).attr('title'));
}).each(function() {
   $(this).attr('title', $(this).text());
});

ทำไมต้องลงคะแนน? โปรดแสดงความคิดเห็นหากคุณกำลังทำเช่นนั้นเพื่อให้คนรู้ว่าปัญหาคืออะไร ขอบคุณ
fanfavorite

2

หากคุณต้องการทำสิ่งนี้โดยใช้จาวาสคริปต์เท่านั้นฉันจะทำสิ่งต่อไปนี้ กำหนดคุณสมบัติ id ของ span (เพื่อให้สามารถดึงข้อมูลได้ง่ายจาก DOM) และวางเนื้อหาทั้งหมดในแอตทริบิวต์ชื่อ 'เนื้อหา':

<span id='myDataId' style='text-overflow: ellipsis; overflow : hidden;
 white-space: nowrap; width: 71;' content='{$myData}'>${myData}</span>

จากนั้นในจาวาสคริปต์ของคุณคุณสามารถทำสิ่งต่อไปนี้หลังจากองค์ประกอบถูกแทรกลงใน DOM

var elemInnerText, elemContent;
elemInnerText = document.getElementById("myDataId").innerText;
elemContent = document.getElementById("myDataId").getAttribute('content')
if(elemInnerText.length <= elemContent.length)
{
   document.getElementById("myDataId").setAttribute('title', elemContent); 
}

แน่นอนถ้าคุณใช้จาวาสคริปต์เพื่อแทรกการเว้นวรรคลงใน DOM คุณก็สามารถเก็บเนื้อหาไว้ในตัวแปรก่อนที่จะแทรกเข้าไป วิธีนี้คุณไม่จำเป็นต้องมีแอททริบิวเนื้อหาในช่วง

มีวิธีแก้ไขปัญหาที่หรูหรากว่านี้ถ้าคุณต้องการใช้ jQuery


ดี เนื่องจากฉันใช้ JQuery ในส่วนอื่น ๆ ของหน้านี้ - อะไรคือ JQuery โซลูชั่นที่หรูหรา?
Spiderman

$("#myDataId").attr("title", function() { var innerText = $(this).text(); var content = $(this).attr("content"); if (innerText.length <= content.length) { return content; } return null; });
Mark Costello

1
ฉันลองใช้คำแนะนำแรกของคุณด้วย javascript แท้ๆ - มันไม่ทำงาน คุณสมบัติ 'innerText' บันทึกความยาวทั้งหมดของข้อความแม้ว่าจะไม่แสดงอย่างสมบูรณ์บนหน้าจอดังนั้นเสมอ: elemInnerText.length == elemContent.length !!

รูปแบบของการขยายของคุณคือความกว้าง 71 ทำไมไม่ลองตรวจสอบว่าความกว้างของสายยาวกว่านั้นหรือไม่? หากคุณต้องการทำอะไรที่ขี้ขลาดจริงๆคุณสามารถเพิ่มองค์ประกอบที่ซ่อนอยู่โดยไม่มีการล้นข้อความ: ตั้งจุดไข่ปลาและเปรียบเทียบความกว้างของทั้งสอง หากสิ่งที่ซ่อนอยู่กว้างกว่าอันที่ไม่ได้ซ่อนไว้ให้เพิ่มแอททริบิวต์หัวเรื่องลงในสิ่งที่มองเห็นได้
Mark Costello

2

ฉันมีคลาส CSS ซึ่งกำหนดตำแหน่งที่จะวางจุดไข่ปลา จากนั้นฉันทำสิ่งต่อไปนี้ (ชุดองค์ประกอบอาจแตกต่างกันฉันเขียนสิ่งเหล่านั้นโดยใช้จุดไข่ปลาแน่นอนมันอาจเป็นตัวเลือกคลาสแยกต่างหาก):

$(document).on('mouseover', 'input, td, th', function() {
    if ($(this).css('text-overflow') && typeof $(this).attr('title') === 'undefined') {
        $(this).attr('title', $(this).val());
    }
});

1
ฉันthisเป็นกรณีของฉันanchorดังนั้นฉันจึงใช้this.text()แทนval()
Basheer AL-MOMANI

2

นี่คือโซลูชันของ Vanilla JavaScript:

(function init() {

  var cells = document.getElementsByClassName("cell");

  for(let index = 0; index < cells.length; ++index) {
    let cell = cells.item(index);
    cell.addEventListener('mouseenter', setTitleIfNecessary, false);
  }

  function setTitleIfNecessary() {
    if(this.offsetWidth < this.scrollWidth) {
      this.setAttribute('title', this.innerHTML);
    }
  }

})();
.cell {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  border: 1px;
  border-style: solid;
  width: 120px; 
}
<div class="cell">hello world!</div>
<div class="cell">hello mars! kind regards, world</div>


1

นี่คือทางออกของฉันใช้งานได้ดี!

    $(document).on('mouseover', 'input, span', function() {
      var needEllipsis = $(this).css('text-overflow') && (this.offsetWidth < this.scrollWidth);
      var hasNotTitleAttr = typeof $(this).attr('title') === 'undefined';
      if (needEllipsis === true) {
          if(hasNotTitleAttr === true){
            $(this).attr('title', $(this).val());
          }
      }
      if(needEllipsis === false && hasNotTitleAttr == false){
        $(this).removeAttr('title');
      }
  });

สวัสดี @FarukT ทางออกของคุณใช้ได้ดีสำหรับฉันขอบคุณมาก ฉันต้องการถามว่าฉันมีสองแท็ก html หรือไม่สมมติว่าฉันป้อนและขยายและฉันต้องการคำนวณ offsetWidth ของแท็กทั้งสองนี้พร้อมกันเพื่อทำการคำนวณทางคณิตศาสตร์บางอย่างโดยใช้ offsetWidth เหล่านั้น ฉันจะทำอย่างไร
Kunal Tyagi

สวัสดี @KunalTyagi คุณสามารถทำได้ด้วย 2 ฟังก์ชั่นที่แยกกันผมเขียนเพียงอันเดียวด้วยอินพุตและขยาย แต่คุณสามารถทำซ้ำฟังก์ชันนี้ได้ 2 ครั้งฟังก์ชันฟอเร็กซ์ตัวอย่างแรกกับอินพุตเท่านั้นและในฟังก์ชันที่สองเท่านั้นที่ขยาย ดังนี้: $ (เอกสาร) .on ('mouseover', 'input', function () {... }); และรายการที่สอง $ $ (document) .on ('mouseover', 'span', function () {... });
FarukT

0

วิธีแก้ปัญหาด้านบนไม่ได้ผลสำหรับฉัน แต่ฉันหาวิธีแก้ปัญหาที่ยอดเยี่ยม ความผิดพลาดที่ใหญ่ที่สุดที่ผู้คนทำคือการมีคุณสมบัติ CSS ทั้งหมด 3 รายการที่ประกาศไว้บนองค์ประกอบเมื่อโหลดเจล คุณต้องเพิ่มสไตล์ + คำแนะนำเครื่องมือแบบไดนามิก IF และเฉพาะในช่วงที่คุณต้องการจุดไข่ปลาเปิดกว้างกว่าผู้ปกครอง

    $('table').each(function(){
        var content = $(this).find('span').text();
        var span = $(this).find('span');
        var td = $(this).find('td');
        var styles = {
            'text-overflow':'ellipsis',
            'white-space':'nowrap',
            'overflow':'hidden',
            'display':'block',
            'width': 'auto'
        };
        if (span.width() > td.width()){
            span.css(styles)
                .tooltip({
                trigger: 'hover',
                html: true,
                title: content,
                placement: 'bottom'
            });
        }
    });

0

คุณสามารถล้อมรอบการขยายด้วยการขยายอีกครั้งจากนั้นเพียงทดสอบว่าความกว้างของการแผ่ขยายเดิม / ภายในมีค่ามากกว่าค่าของช่วงขยายภายนอก / ใหม่ โปรดทราบว่าฉันอาจจะบอกว่า - มันขึ้นอยู่กับสถานการณ์ของฉันที่ฉันมีspanด้านในของtdดังนั้นฉันไม่รู้จริง ๆ ว่าถ้ามันจะทำงานกับspanภายในของspanภายในของ

นี่คือรหัสของฉันสำหรับคนอื่นที่อาจพบว่าตัวเองอยู่ในตำแหน่งที่คล้ายกับของฉัน ฉันกำลังคัดลอก / วางโดยไม่มีการดัดแปลงแม้ว่าจะอยู่ในบริบทเชิงมุมฉันไม่คิดว่าจะเบี่ยงเบนความสนใจจากการอ่านและแนวคิดที่สำคัญ ฉันเขียนมันเป็นวิธีการบริการเพราะฉันต้องการใช้มันมากกว่าหนึ่งแห่ง ตัวเลือกที่ฉันผ่านเข้ามาเป็นตัวเลือกชั้นเรียนที่จะจับคู่หลายอินสแตนซ์

CaseService.applyTooltip = function(selector) {
    angular.element(selector).on('mouseenter', function(){
        var td = $(this)
        var span = td.find('span');

        if (!span.attr('tooltip-computed')) {
            //compute just once
            span.attr('tooltip-computed','1');

            if (span.width() > td.width()){
                span.attr('data-toggle','tooltip');
                span.attr('data-placement','right');
                span.attr('title', span.html());
            }
        }
    });
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.