2014-04-23 7 views
8

हाय दोस्तों मैं एक div में फीका करना चाहता हूं जब मैं किसी अन्य div पर क्लिक करता हूं और इसके लिए मैं निम्नलिखित कोड का उपयोग कर रहा हूं। कोड 1 ठीक काम करता है लेकिन मुझे कोड 2 का उपयोग करने की आवश्यकता है।फंक्शन में शुद्ध जावास्क्रिप्ट फीका

मैं जानता हूँ कि jQuery है, लेकिन मैं जावास्क्रिप्ट

में ऐसा करने की आवश्यकता होती है तुम मुझे उस गलती की किस तरह मैं कर रहा हूँ या क्या मैं बदलने की जरूरत है मार्गदर्शन कर सकते हैं ...

Code1 - - ठीक

function starter() { fin(); } 

function fin() 
{ 
    for (i = 0; i <= 1; i += 0.01) 
    { 
     i=Math.round(i*100)/100; 
     setTimeout("seto(" + i + ")", i * 1000); 
    } 
} 

function seto(opa) 
{ 
    var ele = document.getElementById("div1"); 
    ele.style.opacity = opa; 
} 

Code2 काम करता है --- काम नहीं करता

function starter() 
{ 
    var ele = document.getElementById("div1"); 
    fin(ele); 
} 
function fin(ele) 
{ 
    for (i = 0; i <= 1; i += 0.01) 
    { 
     i=Math.round(i*100)/100; 
     setTimeout("seto(" + ele + "," + i + ")", i * 1000); 
    } 
} 

function seto(ele,opa) 
{ 
    ele.style.opacity = opa; 
} 
+0

यहाँ एक छोटे से मणि के साथ कि http://youmightnotneedjquery.com/ – series0ne

+0

किसी भी सांत्वना त्रुटियों आप में मदद मिलेगी है? – laaposto

+0

आपको वास्तव में 'setInterval' और' clearInterval' का उपयोग करना चाहिए। Http://stackoverflow.com/questions/2695462/fade-html-element-with-raw-javascript – dave

उत्तर

18

this साइट के आधार पर

संपादित -1
जोड़ा गया कार्यक्षमता है कि उपयोगकर्ता एनीमेशन अवधि निर्दिष्ट कर सकते हैं (@Marzian टिप्पणी)

आप इस कोशिश कर सकते हैं ताकि:

function fadeIn(el, time) { 
    el.style.opacity = 0; 

    var last = +new Date(); 
    var tick = function() { 
    el.style.opacity = +el.style.opacity + (new Date() - last)/time; 
    last = +new Date(); 

    if (+el.style.opacity < 1) { 
     (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16); 
    } 
    }; 

    tick(); 
} 

var el = document.getElementById("div1"); 
fadeIn(el, 3000); //first argument is the element and second the animation duration in ms 

DEMO

+0

पास कर रहा हूं, मैंने इसे अपनी आवश्यकताओं के लिए थोड़ा सा संपादित किया है ... http://jsfiddle.net/TH2dn/3/ पर ... और यह दोस्त काम नहीं करता क्योंकि मैंने मूल्य का उपयोग किया है एक और फ़ंक्शन – kanudo

+0

हां, क्योंकि आप अपने ऑनक्लिक फ़ंक्शन को नहीं दबाते हैं। यह काम कर रहा है http://jsfiddle.net/TH2dn/4/ – laaposto

+0

यहां पढ़ें http://stackoverflow.com/questions/9114747/onclick-event-not-firing-on-jsfiddle-net – laaposto

1

आपके तत्व को एक स्ट्रिंग में बदलने की कोशिश करने जैसा लगता है। प्रयास करें इस बजाय

function starter() 
{ 
    var ele = document.getElementById("div1"); 
    fin(ele); 
} 
function fin(ele) 
{ 
    for (i = 0; i <= 1; i += 0.01) 
    { 
     i=Math.round(i*100)/100; 
     setTimeout(function() { setto(ele,i); }, i * 1000); 
    } 
} 

function seto(ele,opa) 
{ 
    ele.style.opacity = opa; 
} 

यहाँ क्या होता है, कि मैं एक anonnymous फ़ंक्शन को कॉल टाइमर हिट, और कहा कि समारोह से, मेरे functioncall setto को निष्पादित करें।

उम्मीद है कि यह मदद करता है। जोनास

+0

पर एक नज़र डालें आपके पास एक टाइपो 'सेटटो' होना चाहिए 'seto' – laaposto

+0

मैंने यह भी कोशिश की लेकिन यह नहीं देता मुझे फीका प्रभाव। div सीधे दिखाई देता है – kanudo

+0

और यदि कॉल पैरामीटर स्ट्रिंग में परिवर्तित हो रहा है तो "कोड 1" भी काम नहीं करना चाहिए ... कोड दोनों के बीच एकमात्र अंतर यह है कि "कोड 1" में मैं सेटटाइमआउट के तहत केवल एक पैरामीटर पास कर रहा हूं जबकि "कोड 2" में मैं 2 पैरामीटर – kanudo

1

यहां समस्या यह है कि आप setTimeout का उपयोग करने के पास-ए-स्ट्रिंग विधि का उपयोग कर रहे हैं। जो मूल रूप से सिर्फ एक छिपी हुई eval है।

यह ध्यान देने योग्य है कि यह एक खराब अभ्यास, धीमी कलाकार और सुरक्षा जोखिम है।

(इस जैसे सवालों देखें: setTimeout() with string or (anonymous) function reference? speedwise)

कारण यह आपकी समस्या का कारण है क्योंकि "seto(" + ele + "," + i + ")""seto('[object HTMLDivElement]', 1)" करने का मूल्यांकन करने के लिए जा रहा है है। आप वास्तव में ele ऑब्जेक्ट का संदर्भ पास करना चाहते हैं - लेकिन जब आप किसी ऑब्जेक्ट को किसी स्ट्रिंग पर संयोजित करने का प्रयास करते हैं तो मान को स्ट्रिंग में डाला जा रहा है। आप setTImeout का उपयोग करने के पास-ए-फ़ंक्शन विधि का उपयोग करके इसे प्राप्त कर सकते हैं।

setTimeout(function() { seto(ele, i); }, i * 1000);

मैं इस परिवर्तन Code1 करने के लिए अपने Code2 व्यवहार बराबर कर देगा बनाने विश्वास।

+0

मैंने कोशिश की लेकिन div सीधे दिखाई देता है और कोई लुप्तप्राय नहीं होता – kanudo

1

नीचे --- मेरे सवाल

ANS1 को पूरा जवाब हैं DEMO

function fin() { 
    var i = 0; 
    var el = document.getElementById("div1"); 
    fadeIn(el,i); 
} 

function fadeIn(el,i) { 
    i = i + 0.01; 
    seto(el,i); 
    if (i<1){setTimeout(function(){fadeIn(el,i);}, 10);} 
} 

function seto(el,i) { 
    el.style.opacity = i; 
} 

ANS2 --- DEMO

function fin(){ 
    var i = 0; 
    var el = document.getElementById("div1"); 
    fadeIn(el,i); 
} 

function fadeIn(el,i) { 
    var go = function(i) { 
     setTimeout(function(){ seto(el,i); } , i * 1000); 
    }; 
    for (i = 0 ; i<=1 ; i = i + 0.01) go(i); 
} 

function seto(el,i) 
{ 
    el.style.opacity = i; 
} 
2
var div = document.getElementById('div'); 
div.style.transition="opacity 1s"; 
div.style.opacity="0"; 
+0

उत्तर @ केई के लिए धन्यवाद, लेकिन यह एक लुप्तप्राय प्रभाव नहीं देता – kanudo

+1

यह ** HTML5 ** के साथ है; यहां एक पहेली है जो मेरे लिए काम करती है: http://jsfiddle.net/kychan/esP2z/ BTW। यह एक फीका आउट था। यहां एक फीड उदाहरण है: http://jsfiddle.net/kychan/VP9wJ/ – Kai

+0

Ya @kai यह काम करता है :) लेकिन जब मैंने सीएसएस की डिस्प्ले प्रॉपर्टी का उपयोग किया तो यह नहीं है ... उदाहरण @ http://jsfiddle.net/ VP9wJ/1/ – kanudo

1

मेरे संस्करण

function fadeIn($element){ 
    $element.style.display="block"; 
    $element.style.opacity=0; 
    recurseWithDelayUp($element,0,1); 
} 
function fadeOut($element){ 
    $element.style.display="block"; 
    $element.style.opacity=1; 
    recurseWithDelayDown($element,1,0); 
} 

function recurseWithDelayDown($element,startFrom,stopAt){ 
    window.setTimeout(function(){ 
     if(startFrom > stopAt){ 
      startFrom=startFrom - 0.1; 
      recurseWithDelayDown($element,startFrom,stopAt) 
      $element.style.opacity=startFrom; 
     }else{ 
     $element.style.display="none" 
     } 
    },30); 
} 
function recurseWithDelayUp($element,startFrom,stopAt){ 
    window.setTimeout(function(){ 
     if(startFrom < stopAt){ 
      startFrom=startFrom + 0.1; 
      recurseWithDelayUp($element,startFrom,stopAt) 
      $element.style.opacity=startFrom; 
     }else{ 
     $element.style.display="block" 
     } 
    },30); 
} 
संबंधित मुद्दे