Avatar billede tcarlsen Nybegynder
16. april 2008 - 16:04 Der er 20 kommentarer og
1 løsning

Get javascript string i html

Jeg er ved at lave et dynamisk link i javascript men har problemmer med at lave onclick om:
<script>
if(noget){
string1 = "window.open(this.href); return false;";
} else if(noget andet){
string1 = "popup_test; return false;";
}
document.getElementById('id1').onclick = ""+string1;
</script>
<a id="id1" href="" onclick="">

har lavet samme nummer med href og det virker sjovt nok med onclick ændres ikke. der linkes bare i samme vindue...
Avatar billede jokkejensen Novice
16. april 2008 - 16:27 #1
<a id="id1" href="" onclick="">

Sådan kan du ikke skrive det. Du kan ikke tildele en streng som event.


ikke testet:
<script type="text/javascript">
document.getElementById('id1').onclick = function{
if(noget){
window.open(this.href); return false;
} else if(noget andet){
popup_test;
return false;
}
}
</script>
Avatar billede tcarlsen Nybegynder
16. april 2008 - 16:42 #2
Hvorfor kan jeg ikke køre et tjek før... og så kalde document.getElementById('id1').onclick = en string ???

skal jo hgave det ud i html'en sammen med den anden data har ikke kun den string i mine if sætninger
Avatar billede tcarlsen Nybegynder
16. april 2008 - 16:43 #3
Jeg mener det virker jo fint med document.getElementById('id1').href = string

det virker fint det kun onclick der ikke gider dette
Avatar billede jokkejensen Novice
16. april 2008 - 17:11 #4
egenskaben href på et anchor, er ikke at forveksle med en funktion..

Hvis du vil lave din if først ser det sådan her ud:

<script type="text/javascript">

if(noget){
document.getElementById('id1').onclick = function{window.open(this.href); return false;}
} else if(noget andet){
document.getElementById('id1').onclick = function{
popup_test;
return false;
}
}
}
</script>

Men det giver mere kode..

/JJ
Avatar billede montago Praktikant
16. april 2008 - 17:57 #5
hmm...

hvad med

document.getElementById("id").innerHTML = "<a href=\"java script:window.open('')\">ping</a>"

på dén måde kan man godt lave en string om til et 'event'
Avatar billede w13 Novice
16. april 2008 - 18:57 #6
Ja, men innerHTML er jo ikke videre validt.

Det kan gøres med string sådan her:

document.getElementById("id1").onclick = new Function("alert('bla')");

Og derfor også:

document.getElementById("id1").onclick = new Function(string1);

Som JokkeJensen siger, kan eventhandlers (såsom onclick, onmouseover, o.lign.) kun indeholde funktioner, og ikke tekststrenge, så derfor skal der noget "Function" til.
Avatar billede montago Praktikant
16. april 2008 - 19:40 #7
ffs... nu begynder du ikke også...
http://www.eksperten.dk/spm/827792

OleBole har vist hjernevasket alle brugerne på eksperten...

min innerHTML løsning tillader at man String-Builder sine events, og indskriver dem i HTML'en - nice and easy...

din løsning hiver fat i EVAL (EVIL) som kan være tung og farlig - men ikke desto mindre et rigtigt valg...

jeg ville nok i stedet pege på en funktion som udførte det ønskede arbejde

//--------------

function ClickHandler(){ alert(pingeling) }

document.getElementById("id1").onclick = ClickHandler

//---------------
Avatar billede w13 Novice
16. april 2008 - 19:49 #8
Hvor kommer Eval ind i billedet?
Avatar billede montago Praktikant
16. april 2008 - 20:28 #9
Function() er jo nødt til at fortolke teksten... == eval

eller tager jeg fejl... ?
Avatar billede w13 Novice
16. april 2008 - 21:30 #10
Jeg skal ikke kunne sige, om der ligger samme fortolker-kode til grund for Function() som for Eval(). Det er da muligt.
Avatar billede montago Praktikant
16. april 2008 - 23:13 #11
Eval er kun et problem hvis man smider meget kode ind i den... men i dette tilfælde er det som sagt det bedre valg.
Avatar billede olebole Juniormester
17. april 2008 - 00:07 #12
<ole>

montago >> Hvad er din baggrund for at mene, at JavaScript's eval-funktion skulle være indblandet i Function objektet. Personligt kan jeg ikke finde nogen dokumentation for, det skulle være tilfældet i Rhino eller SpiderMonkey.

Hvad innerHTML angår, er det spørgsmålet, hvem der er hjernevasket, og hvem der faktisk har gjort sig anstrengelser for at sætte sig ind i emnet. Prøv at læse min kommentar i tråden, du linker til:
    http://www.eksperten.dk/spm/827792#rid7088572

/mvh
</bole>
Avatar billede olebole Juniormester
17. april 2008 - 00:23 #13
- og derudover tager du også fejl med hensyn til Function objektet og eval funktionen. Function objektet performer (i visse situationer/browsere væsentligt) bedre end eval
Avatar billede montago Praktikant
17. april 2008 - 08:52 #14
ok ..  Function != eval...

end of discussion
Avatar billede tcarlsen Nybegynder
17. april 2008 - 10:31 #15
<script type="text/javascript">

if(noget){
document.getElementById('id1').onclick = function{window.open(this.href); return false;}
} else if(noget andet){
document.getElementById('id1').onclick = function{
popup_test;
return false;
}
}
}
</script>

virker ikke den åbner stadig i samme vindue som den er i... :S
Avatar billede roenving Novice
17. april 2008 - 10:57 #16
Der mangler jo også et sæt paranteser:

= function(){window.open(this.href,"winName"); return false;}
Avatar billede w13 Novice
17. april 2008 - 11:35 #17
Ja, husk at bruge function() og ikke bare function.
Avatar billede tcarlsen Nybegynder
21. april 2008 - 17:01 #18
Problemmet i dettet script er at jeg ønsker onclick i bunden af koden skal være dynamisk og tage udgangspunkt i ixf.linktype2[billedserieCount] men for at billedserieCount virker skal dette gøre under functionen billedserieTeaser() og så vil onclick i bunden ikke være med til at jeg laver en
function test() { java script:window.open(this.href);return false; }
(onclick="java script: test();") .... kan dette overhoved lade sig gøre....??

<script language="javascript">
   
var ixf = { 'clock' : null, 'count' : 1 }

ixf.imgs = [
'http://www.test.dk/april/a2.jpg',
'http://www.test.dk/a1.jpg'
];

ixf.imgtext = [
'test af artikel',
'billedgalleri test'
];

ixf.imglinks = [
'http://www.test.dk/article',
'http://www.test.dk/tngallery'
];

ixf.linktype2 = [
'java script:window.open(this.href);return false;',
'java script:popup_picturegallery(this); return false;'
];




/*****************************************************************************
*****************************************************************************/



//cache the images
ixf.imgsLen = ixf.imgs.length;
ixf.cache = [];
for(var i=0; i<ixf.imgsLen; i++){
    ixf.cache[i] = new Image;
    ixf.cache[i].src = ixf.imgs[i];
}


//crossfade setup function
function crossfade(){
    //if the timer is not already going
    if(ixf.clock == null)
    {
        //copy the image object
        ixf.obj = arguments[0];
       
        //copy the image src argument
        ixf.src = arguments[1];
       
        //store the supported form of opacity
        if(typeof ixf.obj.style.opacity != 'undefined')
        {
            ixf.type = 'w3c';
        }
        else if(typeof ixf.obj.style.MozOpacity != 'undefined')
        {
            ixf.type = 'moz';
        }
        else if(typeof ixf.obj.style.KhtmlOpacity != 'undefined')
        {
            ixf.type = 'khtml';
        }
        else if(typeof ixf.obj.filters == 'object')
        {
            //weed out win/ie5.0 by testing the length of the filters collection (where filters is an object with no data)
            //then weed out mac/ie5 by testing first the existence of the alpha object (to prevent errors in win/ie5.0)
            //then the returned value type, which should be a number, but in mac/ie5 is an empty string
            ixf.type = (ixf.obj.filters.length > 0 && typeof ixf.obj.filters.alpha == 'object' && typeof ixf.obj.filters.alpha.opacity == 'number') ? 'ie' : 'none';
        }
        else
        {
            ixf.type = 'none';
        }
       
        //change the image alt text if defined
        if(typeof arguments[3] != 'undefined' && arguments[3] != '')
        {
            ixf.obj.alt = arguments[3];
        }
       
        //if any kind of opacity is supported
        if(ixf.type != 'none')
        {
            //create a new image object and append it to body
            //detecting support for namespaced element creation, in case we're in the XML DOM
            ixf.newimg = document.getElementsByTagName('body')[0].appendChild((typeof document.createElementNS != 'undefined') ? document.createElementNS('http://www.w3.org/1999/xhtml', 'img') : document.createElement('img'));

            //set positioning classname
            //ixf.newimg.className = 'idupe';
            ixf.newimg.style.position = 'absolute';
            ixf.newimg.style.zIndex = 3000;
            ixf.newimg.style.visibility = 'hidden';
           
            //set src to new image src
            ixf.newimg.src = ixf.src

            //move it to superimpose original image
            ixf.newimg.style.left = ixf.getRealPosition(ixf.obj, 'x') + 'px';
            ixf.newimg.style.top = ixf.getRealPosition(ixf.obj, 'y') + 'px';
           
            //copy and convert fade duration argument
            ixf.length = parseInt(arguments[2], 10) * 1000;
           
            //create fade resolution argument as 20 steps per transition
            ixf.resolution = parseInt(arguments[2], 10) * 20;
           
            //start the timer
            ixf.clock = setInterval('ixf.crossfade()', ixf.length/ixf.resolution);
        }

       
        //otherwise if opacity is not supported
        else
        {
            //just do the image swap
            ixf.obj.src = ixf.src;
        }
       
    }
};


//crossfade timer function
ixf.crossfade = function()
{
    //decrease the counter on a linear scale
    ixf.count -= (1 / ixf.resolution);
   
    //if the counter has reached the bottom
    if(ixf.count < (1 / ixf.resolution))
    {
        //clear the timer
        clearInterval(ixf.clock);
        ixf.clock = null;
       
        //reset the counter
        ixf.count = 1;
       
        //set the original image to the src of the new image
        ixf.obj.src = ixf.src;
    }
   
    //set new opacity value on both elements
    //using whatever method is supported
    switch(ixf.type)
    {
        case 'ie' :
            ixf.obj.filters.alpha.opacity = ixf.count * 100;
            ixf.newimg.filters.alpha.opacity = (1 - ixf.count) * 100;
            break;
           
        case 'khtml' :
            ixf.obj.style.KhtmlOpacity = ixf.count;
            ixf.newimg.style.KhtmlOpacity = (1 - ixf.count);
            break;
           
        case 'moz' :
            //restrict max opacity to prevent a visual popping effect in firefox
            ixf.obj.style.MozOpacity = (ixf.count == 1 ? 0.9999999 : ixf.count);
            ixf.newimg.style.MozOpacity = (1 - ixf.count);
            break;
           
        default :
            //restrict max opacity to prevent a visual popping effect in firefox
            ixf.obj.style.opacity = (ixf.count == 1 ? 0.9999999 : ixf.count);
            ixf.newimg.style.opacity = (1 - ixf.count);
    }
   
    //now that we've gone through one fade iteration
    //we can show the image that's fading in
    ixf.newimg.style.visibility = 'visible';
   
    //keep new image in position with original image
    //in case text size changes mid transition or something
    ixf.newimg.style.left = ixf.getRealPosition(ixf.obj, 'x') + 'px';
    ixf.newimg.style.top = ixf.getRealPosition(ixf.obj, 'y') + 'px';
   
    //if the counter is at the top, which is just after the timer has finished
    if(ixf.count == 1)
    {
        //remove the duplicate image
        ixf.newimg.parentNode.removeChild(ixf.newimg);
    }
};



//get real position method
ixf.getRealPosition = function()
{
    this.pos = (arguments[1] == 'x') ? arguments[0].offsetLeft : arguments[0].offsetTop;
    this.tmp = arguments[0].offsetParent;
    while(this.tmp != null)
    {
        this.pos += (arguments[1] == 'x') ? this.tmp.offsetLeft : this.tmp.offsetTop;
        this.tmp = this.tmp.offsetParent;
    }
   
    return this.pos;
};
var billedserieCount = -1;
function billedserieTeaser(){
    if(billedserieCount<ixf.imgs.length-1){
        billedserieCount++;
    } else {
        billedserieCount = 0;
    }
if(ixf.imglinks[billedserieCount].indexOf("tngallery")!=-1){
    ixf.linktype='BILLEDSERIE';
    ixf.linkaction='java script:popup_picturegallery(this); return false;';
}
else if(ixf.imglinks[billedserieCount].indexOf("flash")!=-1){
    ixf.linktype='SOUNDSLIDE';
    ixf.linkaction="java script:raw_popup(this.href, 'Soundslide', 'width=800,height=600, resizable=1'); return false;";
}
else if(ixf.imglinks[billedserieCount].indexOf("xstream")!=-1){
    ixf.linktype='VIDEO';
    ixf.linkaction='java script:popup_xstream(this); return false';
}
else if(ixf.imglinks[billedserieCount].indexOf("dineord")!=-1){
    ixf.linktype='DEBAT';
}
else if(ixf.imglinks[billedserieCount].indexOf("article")!=-1){
    ixf.linktype='ARTIKEL';
    ixf.linkaction="java script:window.open(this.href);return false;";
   
}
crossfade(document.getElementById('billedserieTeaser'), ixf.imgs[billedserieCount], '1', '');
document.getElementById('billedserieTeaserText').innerHTML = "<h2><em class=\"section-tag\"><a href=\""+ixf.imglinks[billedserieCount]+"\" onclick=\""+ixf.linkaction+"\">"+ixf.linktype+"</a></em> <a href=\""+ixf.imglinks[billedserieCount]+"\" onclick=\""+ixf.linkaction+"\">"+ixf.imgtext[billedserieCount]+"</a></h2>";
document.getElementById('billedserieTeaserLink1').href = ""+ixf.imglinks[billedserieCount]+"";
t=setTimeout("billedserieTeaser()",10000);



}
</script>

<a id="billedserieTeaserLink1" href="" onclick="">
    <img id="billedserieTeaser" src="http://www.berlingske.dk/upload/webred/billeder/2008/teaser/april/a2.jpg" width="200" height="115" border="0" />
</a><br />
<div id="billedserieTeaserText" style="width:200px; height:60px "></div>
<script language="javascript">
    billedserieTeaser();
</script>
Avatar billede w13 Novice
21. april 2008 - 18:05 #19
Du skal i hvert fald aldrig bruge "java script:" i en onclick, så dit forslag må blive:

function test() { window.open(this.href);return false; }
(onclick="test();")
Avatar billede montago Praktikant
21. april 2008 - 18:26 #20
blabla.onclick = test //<-- pointer
Avatar billede tcarlsen Nybegynder
29. april 2008 - 09:08 #21
løst på anden vis tak for forsøgende allesammen... lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester