ฉันรู้ว่าคำตอบของฉันจะไม่ถูกใจหลายคน แต่โปรดพิจารณาประเด็นที่อธิบายไว้ที่นี่ก่อนที่จะย่อลงมา
สิ่งใดที่เครื่องอ่านได้อย่างง่ายดายจะทำให้เครื่องส่งข้อความขยะสามารถอ่านได้โดยง่าย แม้ว่าการกระทำของพวกเขาจะดูโง่สำหรับเราพวกเขาไม่ใช่คนโง่ พวกเขาเป็นนวัตกรรมและความมั่งคั่ง พวกเขาไม่เพียงใช้บ็อตเพื่อเก็บอีเมล แต่ยังมีวิธีการมากมายในการกำจัดและนอกจากนั้นพวกเขาก็จ่ายเงินเพื่อรับอีเมลใหม่ ๆ หมายความว่าอะไรพวกเขามีแฮ็กเกอร์แฮ็กสีดำหลายพันคนทั่วโลกเพื่อทำงานของพวกเขา ผู้คนพร้อมที่จะโค้ดมัลแวร์ที่ขูดหน้าจอของเบราว์เซอร์ของผู้อื่นซึ่งทำให้วิธีการใดก็ตามที่คุณพยายามทำให้ไร้ประโยชน์นั้นในที่สุด กระทู้นี้มีผู้อ่านมากกว่า 10 คนและพวกเขาหัวเราะเยาะเรา บางคนอาจรู้สึกเบื่อที่จะรู้ว่าเราไม่สามารถท้าทายพวกเขาใหม่ได้
โปรดทราบว่าในที่สุดคุณไม่ได้พยายามประหยัดเวลา แต่เป็นเวลาของคนอื่น ด้วยเหตุนี้โปรดพิจารณาใช้เวลาเพิ่มที่นี่ ไม่มีเวทย์มนตร์ที่ง่ายต่อการดำเนินการที่จะทำงานได้ หากคุณทำงานใน บริษัท ที่เผยแพร่อีเมลของคน 100 คนบนเว็บไซต์และคุณสามารถลดอีเมลขยะ 1 ฉบับต่อวันต่อคนต่อคนเรากำลังพูดถึงอีเมลขยะจำนวน 36,500 ฉบับต่อปี หากการลบอีเมลดังกล่าวใช้เวลาโดยเฉลี่ย 5 วินาทีเรากำลังพูดถึงประมาณ 50 ชั่วโมงทำงานทุกปี ไม่ต้องพูดถึงปริมาณการรบกวนที่ลดลง ดังนั้นทำไมไม่ใช้เวลาสองสามชั่วโมงนี้
ไม่เพียง แต่คุณและผู้ที่ได้รับอีเมลที่พิจารณาเวลาสินทรัพย์ ดังนั้นคุณต้องหาวิธีทำให้งงงวยที่อยู่อีเมลด้วยวิธีการดังกล่าวซึ่งไม่ได้เป็นการจ่ายเพื่อทำการถอดรหัส หากคุณใช้วิธีการที่ใช้กันอย่างแพร่หลายเพื่อทำให้อีเมล์สับสน ด้วยเหตุนี้แครกเกอร์จะได้รับอีเมล์เป็นพันหากไม่ใช่อีเมลสดนับหมื่นหรือหลายแสน และสำหรับพวกเขาพวกเขาจะได้รับเงิน
ดังนั้นไปข้างหน้าและรหัสวิธีการของคุณเอง นี่เป็นกรณีที่เกิดขึ้นได้ยากซึ่งการคิดค้นล้อใหม่จ่ายจริง ใช้วิธีการที่ไม่สามารถอ่านได้ด้วยเครื่องและวิธีที่ต้องการการโต้ตอบกับผู้ใช้โดยไม่ทำให้ประสบการณ์การใช้งานลดลง
ฉันใช้เวลาประมาณ 20 นาทีเพื่อเขียนโค้ดตัวอย่างสิ่งที่ฉันหมายถึง ในตัวอย่างฉันใช้ KnockoutJS เพียงเพราะฉันชอบและฉันรู้ว่าคุณคงไม่ใช้มันด้วยตัวเอง แต่มันก็ไม่เกี่ยวข้องเลย มันเป็นโซลูชันที่กำหนดเองซึ่งไม่ได้ใช้กันอย่างแพร่หลาย แคร็กมันจะไม่ให้รางวัลสำหรับการทำเช่นนี้เพราะวิธีการทำมันจะทำงานบนหน้าเดียวในอินเทอร์เน็ตมากมาย
นี่คือซอ: http://jsfiddle.net/hzaw6/
รหัสด้านล่างไม่ได้เป็นตัวอย่างของรหัสที่ดี แต่เป็นเพียงตัวอย่างรหัสย่อที่ยากมากสำหรับเครื่องที่จะเข้าใจว่าเราจัดการกับอีเมลได้ที่นี่ และแม้ว่าจะสามารถทำได้ก็ไม่ต้องจ่ายเพื่อดำเนินการในขนาดใหญ่
และใช่ฉันรู้ว่ามันใช้ไม่ได้กับ IE = lte8 เพราะ 'ไม่สามารถรับคุณสมบัติ' ของการอ้างอิงที่ไม่ได้กำหนดหรือการอ้างอิง null 'แต่ฉันไม่สนใจเพราะมันเป็นเพียงตัวอย่างของวิธีการไม่ใช่การใช้งานจริง และไม่ได้ตั้งใจที่จะใช้ในการผลิตเหมือนเดิม รู้สึกอิสระที่จะเขียนโค้ดของคุณเองซึ่งเย็นกว่าแข็งกว่าเทคนิค ฯลฯ
โอ้และไม่เคยตั้งชื่ออีเมลหรืออีเมลใน html หรือ javascript มันเป็นวิธีที่ง่ายเกินไปที่จะขูด DOM และวัตถุหน้าต่างสำหรับชื่ออีเมลหรืออีเมลและตรวจสอบว่ามีสิ่งที่ตรงกับอีเมลหรือไม่ นี่คือเหตุผลที่คุณไม่ต้องการตัวแปรใด ๆ ที่จะมีอีเมลในแบบเต็มรูปแบบและนี่คือสาเหตุที่คุณต้องการให้ผู้ใช้โต้ตอบกับหน้าเว็บก่อนที่คุณจะกำหนดตัวแปรดังกล่าว หากโมเดลวัตถุ javascript ของคุณมีที่อยู่อีเมลใด ๆ ในสถานะพร้อมใช้ DOM คุณจะเปิดเผยที่อยู่เหล่านั้นแก่ผู้ส่งอีเมลขยะ
HTML:
<div data-bind="foreach: contacts">
<div class="contact">
<div>
<h5 data-bind="text: firstName + ' ' + lastName + ' / ' + department"></h5>
<ul>
<li>Phone: <span data-bind="text: phone"></span></li>
<li><a href="#999" data-bind="click:$root.reveal">E-mail</a> <span data-bind="visible: $root.msgMeToThis() != ''"><input class="merged" data-bind="value: mPrefix" readonly="readonly" /><span data-bind="text: '@' + domain"></span></span></li>
</ul>
</div>
</div>
</div>
JS
function ViewModel(){
var self = this;
self.contacts = ko.observableArray([
{ firstName:'John', mPrefix: 'john.doe', domain: 'domain.com', lastName: 'Doe', department: 'Sales', phone: '+358 12 345 6789' },
{ firstName:'Joe', mPrefix: 'joe.w', domain: 'wonder.com', lastName: 'Wonder', department: 'Time wasting', phone: '+358 98 765 4321' },
{ firstName:'Mike', mPrefix: 'yo', domain: 'rappin.com', lastName: 'Rophone', department: 'Audio', phone: '+358 11 222 3333' }
]);
self.msgMeToThis = ko.observable('');
self.reveal = function(m, e){
var name = e.target.attributes.href.value;
name = name.replace('#', '');
self.msgMeToThis(name);
};
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);