Làm cách nào tôi có thể buộc WebKit vẽ lại / sơn lại để tuyên truyền thay đổi kiểu?


247

Tôi có một số JavaScript tầm thường để thực hiện thay đổi kiểu:

sel = document.getElementById('my_id');
sel.className = sel.className.replace(/item-[1-9]-selected/,'item-1-selected');
return false;

Điều này hoạt động tốt với các phiên bản FF, Opera và IE mới nhất, nhưng không thành công trên các phiên bản Chrome và Safari mới nhất.

Nó ảnh hưởng đến hai hậu duệ, xảy ra là anh em ruột. Anh chị em đầu tiên cập nhật, nhưng lần thứ hai thì không. Một phần tử con của phần tử thứ hai cũng có tiêu điểm và chứa thẻ <a> chứa mã ở trên trong thuộc tính onclick .

Trong cửa sổ Chrome Công cụ dành cho nhà phát triển Chrome nếu tôi nâng niu (ví dụ: bỏ chọn & kiểm tra) bất kỳ thuộc tính nào của bất kỳ thành phần nào , anh chị em thứ hai sẽ cập nhật đúng kiểu.

Có một cách giải quyết nào để dễ dàng và lập trình cho bạn về việc làm WebKit đúng cách không?


Tôi nghĩ rằng tôi đang gặp vấn đề này trên Android 4.2.2 (Samsung I9500) khi gói ứng dụng canvas của tôi trong WebView. Nực cười!
Josh

3
what-forces-layout.md một nơi đọc rất tốt
vsync

Câu trả lời:


312

Tôi đã tìm thấy một số gợi ý phức tạp và nhiều gợi ý đơn giản không hiệu quả, nhưng một nhận xét cho một trong số chúng bởi Vasil Dinkov đã cung cấp một giải pháp đơn giản để buộc vẽ lại / sơn lại hoạt động tốt:

sel.style.display='none';
sel.offsetHeight; // no need to store this anywhere, the reference is enough
sel.style.display='';

Tôi sẽ để người khác nhận xét nếu nó hoạt động cho các phong cách khác ngoài khối block.

Cảm ơn, Vasil!


32
Để tránh nhấp nháy bạn có thể thử 'inline-block', 'table'hoặc 'run-in'thay vì 'none', nhưng điều này có thể có tác dụng phụ. Ngoài ra, thời gian chờ là 0 sẽ kích hoạt một dòng lại giống như truy vấn offsetHeight:sel.style.display = 'run-in'; setTimeout(function () { sel.style.display = 'block'; }, 0);
user123444555621

15
Câu trả lời này vẫn còn hữu ích 2 năm sau. Tôi chỉ sử dụng nó để khắc phục sự cố chỉ có Chrome trong đó bóng hộp CSS vẫn còn trên màn hình sau khi thay đổi kích thước trình duyệt theo một số cách nhất định. Cảm ơn!
rkulla

5
@danorton Bạn đã trả lời vào năm 2010. Đó là năm 2013 và lỗi vẫn còn. Cảm ơn. Nhân tiện, có ai biết nếu có bất kỳ vấn đề nào được đăng ký tại trình theo dõi webkit không?
RaphaelDDL

13
PS.: Đối với tôi giải pháp trên không còn hiệu quả nữa. Thay vào đó tôi đã sử dụng cái này (jQuery): sel. Leather (). Show (0); Nguồn: stackoverflow.com/questions/8840580/ từ
Vấn đềOfSumit

7
Tất cả bạn cần làm là đọc một thuộc tính kích thước, bạn không cần phải thay đổi nó qua lại.
Andrew Bullock

93

Gần đây chúng tôi đã gặp phải điều này và phát hiện ra rằng việc quảng bá phần tử bị ảnh hưởng lên một lớp tổng hợp với translZ trong CSS đã khắc phục vấn đề mà không cần thêm JavaScript.

.willnotrender { 
   transform: translateZ(0); 
}

Vì các sự cố vẽ này xuất hiện chủ yếu trong Webkit / Blink và cách khắc phục này chủ yếu nhắm vào Webkit / Blink, nên trong một số trường hợp, nó thích hợp hơn. Đặc biệt là vì câu trả lời được chấp nhận gần như chắc chắn gây ra phản xạ và sơn lại , không chỉ là sơn lại.

Webkit và Blink đã làm việc chăm chỉ để thực hiện hiệu suất và các loại trục trặc này là tác dụng phụ đáng tiếc của việc tối ưu hóa nhằm giảm các dòng chảy và sơn không cần thiết. CSS sẽ thay đổi hoặc một đặc điểm kỹ thuật thành công khác sẽ là giải pháp trong tương lai, rất có thể.

Có nhiều cách khác để đạt được một lớp tổng hợp, nhưng đây là cách phổ biến nhất.


1
Làm việc cho tôi khi sử dụng carousel góc !
gustavohenke

1
Đã khắc phục sự cố của tôi khi bán kính đường viền bị mất trong một phần tử bên trong bảng trượt
Timo

1
Làm việc cho các dự án cordova là tốt!
Quispie

1
Làm việc cho tôi cho một kẹp -webkit-line không làm mới
Adam Marshall

1
Làm việc cho tôi trên ipad (6.0) với -webkit-Transform: dịch (-50%, -50%).
Lain

51

giải pháp danorton không làm việc cho tôi. Tôi đã có một số vấn đề thực sự kỳ lạ khi webkit sẽ không rút ra được một số yếu tố; trong đó văn bản trong đầu vào không được cập nhật cho đến khi onblur; và thay đổi className sẽ không dẫn đến vẽ lại.

Giải pháp của tôi, tôi vô tình phát hiện ra, là thêm một yếu tố phong cách trống vào cơ thể, sau kịch bản.

<body>
...
<script>doSomethingThatWebkitWillMessUp();</script>
<style></style>
...

Điều đó đã sửa nó. Thật là kỳ lạ? Hy vọng điều này là hữu ích cho một ai đó.


3
Tôi sẽ nâng cấp 1.000.000 lần nếu có thể. Đây là cách duy nhất tôi có thể có được chrome để sơn lại một div ngu ngốc mà tôi đang kéo xung quanh. Nhân tiện, bạn không phải thêm một yếu tố phong cách (ít nhất là tôi đã không) bất kỳ yếu tố nào sẽ hoạt động. Tôi đã tạo một div và cung cấp cho nó một id để tôi có thể xóa sau đó thêm phần tử vào mỗi bước, để không điền vào DOM với các thẻ vô dụng.
hobberwickey

6
chỉ sử dụng kết hợp này với nhận xét của Pumbaa80 cho câu trả lời khác. Cách khắc phục mà tôi đã kết thúc làvar div = $('<div>').appendTo(element); setTimeout(function(){ div.remove(); }, 0);
uốn cong

33
Dòng duy nhất này đang làm việc tuyệt vời cho tôi! $('<style></style>').appendTo($(document.body)).remove();
pdelanauze

1
@pdelanauze trả lời hoạt động hoàn hảo. Tôi có một vấn đề vẽ lại hát css3 dịch và biến đổi trong ios.
Marcel Falliere

11
Chỉ cần biết rằng điều này buộc phải sơn lại toàn bộ trang, trong khi hầu hết thời gian bạn chỉ muốn sơn lại một phần nhất định của trang ...
Ryan Wheale

33

Vì trình kích hoạt hiển thị + offset không hoạt động với tôi, tôi đã tìm thấy một giải pháp ở đây:

http://mir.aculo.us/2009/09/25/force-redraw-dom-technique-for-webkit-basing-browsers/

I E

element.style.webkitTransform = 'scale(1)';

3
Tôi đã sử dụng nó trong một bản hack mà tôi đang thử, nhưng thay vì scale(1), tôi đã gán nó cho chính nó element.style.webkitTransform = element.style.webkitTransform. Lý do cho việc này là thiết lập nó trước đây đã làm biến dạng trang một chút cho absolutecác yếu tố định vị ly!
bPratik

Điều này làm việc cho tôi và không gặp vấn đề nhấp nháy hoặc đặt lại vị trí cuộn mà displaygiải pháp đã làm.
davidtbernal

Tôi đã có một ứng dụng Cordova sử dụng rất nhiều SVG động. Hoạt động tốt ở mọi nơi trừ iOS7, trong đó nếu không hiển thị các yếu tố SVG khi khởi động. Đã thêm $ ('body') đơn giản [0] .style.webkitTransform = 'scale (1)'; mã khởi tạo và vấn đề biến mất!
Herc

Điều này không hoạt động như bây giờ, trên Safari và iOS mới nhất.
setholopolus

@setholopolus mà Versoin (s) sẽ là gì?
EricG

23

Tôi đã chịu đựng vấn đề tương tự. Bản sửa lỗi 'hiển thị bật tắt' của danorton đã hoạt động với tôi khi được thêm vào chức năng bước của hoạt hình nhưng tôi lo ngại về hiệu suất và tôi tìm kiếm các tùy chọn khác.

Trong trường hợp của tôi, phần tử không được sơn lại nằm trong phần tử vị trí tuyệt đối, vào thời điểm đó, không có chỉ số z. Việc thêm chỉ mục z vào thành phần này đã thay đổi hành vi của Chrome và việc sơn lại xảy ra như mong đợi -> hoạt ảnh trở nên trơn tru.

Tôi nghi ngờ rằng đây là thuốc chữa bách bệnh, tôi tưởng tượng nó phụ thuộc vào lý do Chrome đã chọn không vẽ lại thành phần này nhưng tôi đang đăng giải pháp cụ thể này ở đây để giúp ai đó hy vọng.

Chúc mừng, Rob

tl; dr >> Hãy thử thêm chỉ số z vào thành phần hoặc cha mẹ của nó.


8
Xuất sắc. Điều này là tuyệt vời và khắc phục vấn đề cho tôi. Một +++ sẽ chỉ mục z một lần nữa.
trisweb

Không hoạt động trong tình huống của tôi đối phó với thanh cuộn và biến đổi.
Ricky Boyce

16

Các công trình sau đây. Nó chỉ phải được đặt một lần trong CSS thuần. Và nó hoạt động đáng tin cậy hơn một hàm JS. Hiệu suất dường như không bị ảnh hưởng.

@-webkit-keyframes androidBugfix {from { padding: 0; } to { padding: 0; }}
body { -webkit-animation: androidBugfix infinite 1s; }

Có vẻ như nó cũng làm việc với tôi. Đã sử dụng điều này để khắc phục sự cố kết xuất với Mobile Safari
Chris

Điều này khắc phục vấn đề của tôi, buộc safari phải chuyển tiếp. Tuy nhiên, tôi đã sử dụng zoomthay vì đệm:@-webkit-keyframes safariBugFix {from { zoom: 100%; } to { zoom: 99.99999%; }}
Ahmed Musallam

13

Vì một số lý do tôi không thể làm cho câu trả lời của danorton hoạt động, tôi có thể thấy những gì nó phải làm vì vậy tôi đã điều chỉnh nó một chút để làm điều này:

$('#foo').css('display', 'none').height();
$('#foo').css('display', 'block');

và nó đã làm việc cho tôi.


7
Tôi đã thử mọi thứ ở trên này, nhưng chỉ có cái này làm việc cho tôi. Bộ web WTF! Đây không phải là khoa học máy tính! Đây là ma thuật đen!
Charlie Martin

7

Tôi đã đến đây vì tôi cần vẽ lại thanh cuộn trong Chrome sau khi thay đổi css của nó.

Nếu ai đó có cùng một vấn đề, tôi đã giải quyết nó bằng cách gọi hàm này:

//Hack to force scroll redraw
function scrollReDraw() {
    $('body').css('overflow', 'hidden').height();
    $('body').css('overflow', 'auto');
}

Phương pháp này không phải là giải pháp tốt nhất, nhưng nó có thể hoạt động với mọi thứ, ẩn và hiển thị phần tử cần vẽ lại có thể giải quyết mọi vấn đề.

Đây là câu đố mà tôi đã sử dụng nó: http://jsfiddle.net/promatik/wZwJz/18/


1
Tuyệt quá! Tôi cũng đang cố gắng làm động các thanh cuộn và đó là thứ tôi cần! Btw sử dụng tốt hơn tràn: lớp phủ cho thanh cuộn hoạt hình
ekalchev

6

Tôi đã vấp phải điều này ngày hôm nay: Element.redraw () cho nguyên mẫu.js

Sử dụng:

Element.addMethods({
  redraw: function(element){
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    (function(){n.parentNode.removeChild(n)}).defer();
    return element;
  }
});

Tuy nhiên, đôi khi tôi nhận thấy rằng bạn phải gọi vẽ lại () trên phần tử có vấn đề trực tiếp. Đôi khi, vẽ lại phần tử cha mẹ sẽ không giải quyết được vấn đề mà đứa trẻ đang gặp phải.

Bài viết hay về cách trình duyệt kết xuất các yếu tố: Kết xuất : sơn lại, chỉnh lại / chuyển tiếp, restyle


1
appendChildlà một phương thức DOM, không phải là một phương thức jQuery.
ChrisW

4

Tôi gặp vấn đề này với một số div được chèn vào div khác, div position: absoluteđược chèn không có thuộc tính vị trí. Khi tôi thay đổi position:relativenó để nó hoạt động tốt. (thực sự rất khó để xác định vấn đề)

Trong trường hợp của tôi, các phần tử được chèn bởi Angular với ng-repeat.


1
Cảm ơn! Điều này cũng làm việc cho vấn đề của tôi, và có trọng lượng nhẹ hơn rất nhiều các giải pháp javascript ở trên.
Dsyko

4

Tôi không thể tin rằng đây vẫn là một vấn đề trong năm 2014. Tôi chỉ gặp vấn đề này khi làm mới hộp chú thích vị trí cố định ở phía dưới bên trái của trang trong khi cuộn, chú thích sẽ 'bóng ma' lên màn hình. Sau khi thử mọi thứ ở trên mà không thành công, tôi nhận thấy rất nhiều thứ bị chậm / gây ra sự cố do tạo ra các chuyển tiếp DOM rất ngắn, v.v ... gây ra cảm giác hơi bất thường khi cuộn, v.v ...

pointer-events: noneCuối cùng tôi đã tạo một vị trí cố định, div kích thước đầy đủ và áp dụng câu trả lời của danorton cho phần tử đó, điều này dường như buộc vẽ lại trên toàn màn hình mà không can thiệp vào DOM.

HTML:

<div id="redraw-fix"></div>

CSS:

div#redraw-fix {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 25;
    pointer-events: none;
    display: block;
}

JS:

sel = document.getElementById('redraw-fix');
sel.style.display='none';
sel.offsetHeight; // no need to store this anywhere, the reference is enough
sel.style.display='block';

Tôi không thể cảm ơn bạn đủ cho cách giải quyết của bạn, đó là người duy nhất làm việc cho tôi. Vâng, đó là năm 2017 và vấn đề còn tồn tại. Vấn đề của tôi liên quan đến trang ngôn ngữ RTL sẽ hiển thị trống nếu được làm mới thủ công trên thiết bị di động Android. Các quy tắc z-indexpointer-eventskhông cần thiết ở đây.
Amin Mozafari

Trước đây tôi đã sử dụng bản sửa lỗi của danorton nhưng thực sự vật lộn với đèn flash của nội dung từ cài đặt hiển thị đến không. Giải pháp của bạn làm việc tuyệt vời cho tôi mà không có nội dung flash!
Justin Noel

3

Không phải là câu hỏi này cần một câu trả lời khác, nhưng tôi thấy chỉ đơn giản là thay đổi màu sắc bằng một chút buộc phải sơn lại trong tình huống cụ thể của tôi.

//Assuming black is the starting color, we tweak it by a single bit
elem.style.color = '#000001';

//Change back to black
setTimeout(function() {
    elem.style.color = '#000000';
}, 0);

Điều setTimeoutquan trọng đã được chứng minh là di chuyển sự thay đổi kiểu thứ hai bên ngoài vòng lặp sự kiện hiện tại.


1
Đặt thời gian chờ là 0 tỏ ra hữu ích cho tôi trong một tình huống khác nhưng tương tự. Việc vẽ lại không xảy ra trước khi xác thực jquery không phô trương đóng băng màn hình trong khi nó phân tích cú pháp một hình thức lớn. Tôi nghĩ tôi sẽ bình luận trong trường hợp có ai đó ở trong tình huống tương tự. Các giải pháp khác không hoạt động trong kịch bản này.
k29

2

Giải pháp duy nhất hiệu quả với tôi tương tự như câu trả lời của sowasred2012:

$('body').css('display', 'table').height();
$('body').css('display', 'block');

Tôi có rất nhiều khối vấn đề trên trang, vì vậy tôi thay đổi displaythuộc tính của phần tử gốc. Và tôi sử dụng display: table;thay vì display: none;, vì nonesẽ thiết lập lại cuộn bù.


1

Vì mọi người dường như có vấn đề và giải pháp riêng, tôi nghĩ rằng tôi sẽ thêm thứ gì đó phù hợp với mình. Trên Android 4.1 với Chrome hiện tại, cố gắng kéo một khung vẽ xung quanh bên trong div có tràn: bị ẩn, tôi không thể vẽ lại trừ khi tôi thêm một phần tử vào div cha (nơi nó sẽ không gây hại gì).

var parelt = document.getElementById("parentid");
var remElt = document.getElementById("removeMe");
var addElt = document.createElement("div");
addElt.innerHTML = " "; // Won't work if empty
addElt.id="removeMe";
if (remElt) {
    parelt.replaceChild(addElt, remElt);
} else {
    parelt.appendChild(addElt);
}

Không có màn hình nhấp nháy hoặc cập nhật thực sự, và tự dọn dẹp. Không có biến phạm vi toàn cầu hoặc lớp, chỉ là người địa phương. Dường như không làm tổn thương bất cứ điều gì trên Mobile Safari / iPad hoặc trình duyệt máy tính để bàn.


1

Tôi đang làm việc trên ứng dụng ionic html5, trên một vài màn hình tôi có absolutephần tử định vị, khi cuộn lên hoặc xuống trong các thiết bị iOS (iPhone 4,5,6, 6+) tôi đã gặp lỗi.

Đã thử nhiều giải pháp không ai trong số họ làm việc ngoại trừ giải pháp này giải quyết vấn đề của tôi.

Tôi đã sử dụng lớp css .fixRepainttrên các phần tử vị trí tuyệt đối đó

.fixRepaint{
    transform: translateZ(0);
}

Điều này đã khắc phục vấn đề của tôi, nó có thể giúp một số người


1
Opss một số cách tôi đã không nhìn thấy điều đó. @morewry Cảm ơn bạn đã chỉ ra
Anjum ....

1

Tôi sử dụng transform: translateZ(0);phương pháp nhưng trong một số trường hợp là không đủ.

Tôi không phải là người thích thêm và xóa một lớp nên tôi đã cố gắng tìm cách giải quyết vấn đề này và kết thúc với một bản hack mới hoạt động tốt:

@keyframes redraw{
    0% {opacity: 1;}
    100% {opacity: .99;}
}

// ios redraw fix
animation: redraw 1s linear infinite;

0

Điều này tốt cho JS

sel.style.display='none';
sel.offsetHeight; // no need to store this anywhere, the reference is enough
sel.style.display='block';

Nhưng trong Jquery, và đặc biệt khi bạn chỉ có thể sử dụng $ (tài liệu). Đã và không thể liên kết với sự kiện .load của một đối tượng vì bất kỳ lý do cụ thể nào, điều sau đây sẽ hoạt động.

Bạn cần lấy bộ chứa OUTER (MOST) của các đối tượng / div và sau đó xóa tất cả nội dung của nó thành một biến, sau đó thêm lại nó. Nó sẽ làm cho TẤT CẢ các thay đổi được thực hiện trong thùng chứa bên ngoài có thể nhìn thấy.

$(document).ready(function(){
    applyStyling(object);
    var node = $("div#body div.centerContainer form div.centerHorizontal").parent().parent();
    var content = node.html();
    node.html("");
    node.html(content);
}

0

Tôi thấy phương pháp này hữu ích khi làm việc với các hiệu ứng chuyển tiếp

$element[0].style.display = 'table'; 
$element[0].offsetWidth; // force reflow
$element.one($.support.transition.end, function () { 
    $element[0].style.display = 'block'; 
});

0

hack "display / offsetHeight" không hoạt động trong trường hợp của tôi, ít nhất là khi nó được áp dụng cho phần tử đang hoạt hình.

tôi đã có một menu thả xuống đang được mở / đóng trên nội dung trang. các tạo phẩm đã được để lại trên nội dung trang sau khi menu đã đóng (chỉ trong trình duyệt webkit). Cách duy nhất để hack "display / offsetHeight" hoạt động là nếu tôi áp dụng nó vào cơ thể, điều này có vẻ khó chịu.

tuy nhiên, tôi đã tìm một giải pháp khác:

  1. trước khi phần tử bắt đầu hoạt hình, hãy thêm một lớp định nghĩa "-webkit-backface-viewer: hidden;" trên phần tử (bạn cũng có thể sử dụng kiểu nội tuyến, tôi đoán vậy)
  2. khi hoàn thành hoạt hình, hãy xóa lớp (hoặc kiểu)

điều này vẫn còn khá khó khăn (nó sử dụng thuộc tính CSS3 để buộc kết xuất phần cứng), nhưng ít nhất nó chỉ ảnh hưởng đến yếu tố được đề cập và hoạt động với tôi trên cả safari và chrome trên PC và Mac.


0

Điều này có vẻ liên quan đến điều này: Kiểu jQuery không được áp dụng trong Safari

Giải pháp được đề xuất trong phản hồi đầu tiên đã hoạt động tốt với tôi trong các tình huống này, cụ thể là: áp dụng và loại bỏ một lớp giả cho cơ thể sau khi thực hiện thay đổi kiểu dáng:

$('body').addClass('dummyclass').removeClass('dummyclass');

Điều này buộc safari phải vẽ lại.


Để làm việc này trong Chrome, tôi đã phải thêm: $ ('body'). AddClass ('dummyclass'). Delay (0) .removeClass ('dummyclass');
mbokil

0

đề nghị trên không làm việc cho tôi. nhưng cái dưới đây thì có.

Muốn thay đổi văn bản bên trong neo một cách linh hoạt. Từ "Tìm kiếm". Tạo một thẻ bên trong "phông chữ" với thuộc tính id. Quản lý nội dung bằng javascript (bên dưới)

Tìm kiếm

nội dung kịch bản:

    var searchText = "Search";
    var editSearchText = "Edit Search";
    var currentSearchText = searchText;

    function doSearch() {
        if (currentSearchText == searchText) {
            $('#pSearch').panel('close');
            currentSearchText = editSearchText;
        } else if (currentSearchText == editSearchText) {
            $('#pSearch').panel('open');
            currentSearchText = searchText;
        }
        $('#searchtxt').text(currentSearchText);
    }

0

Tôi đã gặp sự cố với một SVG đã biến mất trên Chrome dành cho Android khi định hướng được thay đổi trong một số trường hợp nhất định. Đoạn mã dưới đây không tái tạo nó, nhưng là thiết lập chúng ta đã có.

body {
  font-family: tahoma, sans-serif;
  font-size: 12px;
  margin: 10px;
}
article {
  display: flex;
}
aside {
  flex: 0 1 10px;
  margin-right: 10px;
  min-width: 10px;
  position: relative;
}
svg {
  bottom: 0;
  left: 0;
  position: absolute;
  right: 0;
  top: 0;
}
.backgroundStop1 {
  stop-color: #5bb79e;
}
.backgroundStop2 {
  stop-color: #ddcb3f;
}
.backgroundStop3 {
  stop-color: #cf6b19;
}
<article>
  <aside>
    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="100%" width="100%">
      <defs>
        <linearGradient id="IndicatorColourPattern" x1="0" x2="0" y1="0" y2="1">
          <stop class="backgroundStop1" offset="0%"></stop>
          <stop class="backgroundStop2" offset="50%"></stop>
          <stop class="backgroundStop3" offset="100%"></stop>
        </linearGradient>
      </defs>
      <rect x="0" y="0" rx="5" ry="5" width="100%" height="100%" fill="url(#IndicatorColourPattern)"></rect>
    </svg>
  </aside>
  <section>
    <p>Donec et eros nibh. Nullam porta, elit ut sagittis pulvinar, lacus augue lobortis mauris, sed sollicitudin elit orci non massa. Proin condimentum in nibh sed vestibulum. Donec accumsan fringilla est, porttitor vestibulum dolor ornare id. Sed elementum
      urna sollicitudin commodo ultricies. Curabitur tristique orci et ligula interdum, eu condimentum metus eleifend. Nam libero augue, pharetra at maximus in, pellentesque imperdiet orci.</p>
    <p>Fusce commodo ullamcorper ullamcorper. Etiam eget pellentesque quam, id sodales erat. Vestibulum risus magna, efficitur sed nisl et, rutrum consectetur odio. Sed at lorem non ligula consequat tempus vel nec risus.</p>
  </section>
</article>

Ngày rưỡi sau khi chọc và chọc và không hài lòng với các giải pháp hack được cung cấp ở đây, tôi phát hiện ra rằng vấn đề là do thực tế nó dường như giữ nguyên tố trong bộ nhớ trong khi vẽ một cái mới. Giải pháp là làm cho ID của linearGradient trên SVG là duy nhất, mặc dù nó chỉ được sử dụng một lần trên mỗi trang.

Điều này có thể đạt được bằng nhiều cách khác nhau, nhưng đối với ứng dụng góc cạnh của chúng tôi, chúng tôi đã sử dụng hàm lodash uniqueId để thêm một biến vào phạm vi:

Chỉ thị góc (JS):

scope.indicatorColourPatternId = _.uniqueId('IndicatorColourPattern');

Cập nhật HTML:

Dòng 5: <linearGradient ng-attr-id="{{indicatorColourPatternId}}" x1="0" x2="0" y1="0" y2="1">

Dòng 11: <rect x="0" y="0" rx="5" ry="5" width="100%" height="100%" ng-attr-fill="url(#{{indicatorColourPatternId}})"/>

Tôi hy vọng câu trả lời này sẽ cứu người khác một ngày đáng để đập mặt bàn phím của họ.


0

Tôi muốn giới thiệu một cách ít hackish và trang trọng hơn để buộc một dòng chảy lại : sử dụng forceDOMReflowJS . Trong trường hợp của bạn, mã của bạn sẽ trông như sau.

sel = document.getElementById('my_id');
forceReflowJS( sel );
return false;

0

Tôi thấy rằng chỉ cần thêm một kiểu nội dung vào phần tử buộc nó phải sơn lại, đây sẽ là một giá trị khác nhau mỗi khi bạn muốn nó vẽ lại và không cần phải ở trên phần tử giả.

.selector {
    content: '1'
}

0

Tôi đã cố gắng trả lời nhiều hơn nhưng nó không làm việc cho tôi. Tôi gặp khó khăn khi có cùng clientWidth với safari so với các trình duyệt khác và mã này đã giải quyết vấn đề:

var get_safe_value = function(elm,callback){
    var sty = elm.style
    sty.transform = "translateZ(1px)";
    var ret = callback(elm)//you can get here the value you want
    sty.transform = "";
    return ret
}
// for safari to have the good clientWidth
var $fBody = document.body //the element you need to fix
var clientW = get_safe_value($fBody,function(elm){return $fBody.clientWidth})

Điều này thực sự kỳ lạ bởi vì nếu tôi thử lại để có được clientWidth sau get_safe_value, tôi nhận được một giá trị xấu với safari, thì getter phải nằm giữa sty.transform = "translateZ(1px)";sty.transform = "";

Giải pháp khác hoạt động dứt khoát là

var $fBody = document.body //the element you need to fix
$fBody.style.display = 'none';
var temp = $.body.offsetHeight;
$fBody.style.display = ""
temp = $.body.offsetHeight;

var clientW = $fBody.clientWidth

Vấn đề là bạn mất tập trung và trạng thái cuộn.


0

Điều này sẽ buộc sơn lại trong khi tránh nhấp nháy, mày mò phần tử hiện có và bất kỳ vấn đề bố trí nào ...

function forceRepaint() {
    requestAnimationFrame(()=>{
      const e=document.createElement('DIV');
      e.style='position:fixed;top:0;left:0;bottom:0;right:0;background:#80808001;\
               pointer-events:none;z-index:9999999';
      document.body.appendChild(e);
      requestAnimationFrame(()=>e.remove());  
    });
}

-1

Một giải pháp đơn giản với jquery:

$el.html($el.html());

hoặc là

element.innerHTML = element.innerHTML;

Có một SVG không hiển thị khi nó được thêm vào html.

Điều này có thể được thêm vào sau khi các yếu tố svg trên màn hình.

Giải pháp tốt hơn là sử dụng:

document.createElementNS('http://www.w3.org/2000/svg', 'svg');

và với jQuery:

$(svgDiv).append($(document.createElementNS('http://www.w3.org/2000/svg', 'g'));

điều này sẽ hiển thị chính xác trên Chrome.


Vấn đề với cách tiếp cận này là bạn mất bất kỳ trình xử lý sự kiện nào mà bạn đã đăng ký trên đối tượng hoặc hậu duệ của nó.
Haqa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.