2009 7 Mars 2009

Ringa flera Windows onload funktioner i JavaScript

Heres en annan liten lappa av Javascript knep som jag var tvungen att gräva runt eftersom situationen commaned det. I en av mina webbplatser, hade jag denna situation där jag var tvungen att genomföra "windows.onload" två gånger. Det första som skulle kom till en oerfaren sinne som mitt (Jag måste ärligt säga att eftersom jag har använt JavaScript-ramverk och bibliotek, har jag forgotton att göra enkla saker på egen hand ... sorgligt men sant), är följande metod ...

 window.onload = onloadfn1;
 window.onload = onloadfn2;
 window.onload = onloadfn3;
 etc. ..

Ledsen att säga men, brukar detta arbete ... inte vill diskutera genomförandet vetenskapen av Javascript mycket ... men enligt min senaste erfarenhet, (onloadfn3) endast den sista funktionen faktiskt sjuk får avrättas.

I normala fall, till skillnad från min (som jag ska tala om lite senare) ... du kan göra något av följande för att utföra mutliple onload funktion ....

Eller nåt här

 Funktionen doOnLoad () {
         onloadfn1 ();
         onloadfn2 ();
         onloadfn3 ();
 }
 window.onload = doOnLoad;

För min nuvarande situation, kan jag inte använda någon av ovanstående ...
Varför måste jag ringa windows.onload två gånger, snarare att ringa två funktioner i en enda onload funktion? Här är snabb titt på mitt problem uttalande ...

"Mina sajtens sidor är uppbyggda likt WordPress temat .... dvs det finns en gemensam header.php och footer.php som får ingå i alla webbplatsens sidor. Det finns en onload funktion implementering i footer.php att göra några vanliga onload funktioner. Och det finns få sidor som behöver något eget OnLoad, bortsett från dem som gjorts av vanliga onload funktion. Om jag tilldelar callback-funktion direkt till window.onload handler, kommer den att över-rider som tidigare tilldelats återbesök i footer.php "

.... Är mitt problem förstås :) ?

Tja! det finns få lösningar som jag hittade. De är alla mycket lika och i huvudsak implementions en lösning som ges av Simon Willison ( http://simonwillison.net/2004/May/26/addLoadEvent/ ) ...

Lösning:

Helt enkelt lägga till den här JavaScript-kod till plats ...

 Funktionen addLoadEvent (FUNC) {
     var oldonload = window.onload;
     if (typeof window.onload! = 'funktion') {
        window.onload = funktion
     } Else {
        window.onload = function () {
            if (oldonload) {
                   oldonload ()
           }
           FUNC ()
        }
    }
 }

Och kallar det istället för den vanliga "windows.onload"

 addLoadEvent (FunctionToRunOnPageLoad);
 addLoadEvent (function () {
 / * Mer kod körs när sidan laddas *
 }); 

Fördelar med detta kodsträng ...
1. I första hand låter den du har flera windows.onload händelser, anropas från separata delar av din kod, utan overridding den tidigare definitionen
2. Det är verkligen diskret. Den kan placeras i en fil med dina andra skript eller i en separat fil.
3. Det fungerar även om window.onload redan har ställts in.


2008 20 September, 2008

TEXTAREA Kollaps problem i XSL / XSLT


Problemformuleringen:
Jag sprang in i detta problem när det gäller textfält i XSLs. I enkla ord, uppstår problemet när du har en tom <textarea> tag, då det kommer att kollapsa till <textarea />.
dvs om du hade något i stil med följande i ditt XSL och XML-data för TEXTAREA värdet återgår ingenting ...

<textarea name='description'> <xsl:value-of select="DESCRIPTION"/> </ textarea>

Eftersom webbläsare inte erkänner detta, kommer det att leda till resten av formuläret HTML för att köra in i textområdet.

Möjliga lösningar:

I XSL, lägg en icke-brytande rymd () efter xsl: värdet tag.BEWARE, att ta hand om detta extra utrymme du har lagt under valideringar klientsidan av detta område.

<textarea name='description'> <xsl:value-of select="DESCRIPTION"/> </ textarea>

Eller
<xsl:value-of select="concat (DESCRIPTION,'')"/>

Eller
Sätt ett <xsl:value-of select="@unknown" /> tagg pekar på en okänd attribut. Detta kommer att tvinga PHP XSLT parser för att generera en öppning och stängning tag textområdet, även om det inte har något däremellan.

Eller
Infoga ett <xsl:text> fält som innehåller ett utrymme för att tvinga en sluttagg.

Men även om de ovan nämnda lösningarna kan tyckas att åtgärda problemet, är jag fortfarande inte övertygad om att de är rätt och bästa sätten att åtgärda det. Om det finns något annat bättre sätt att fastställa detta sarkasm, gör oss.


2008 14 SEPTEMBER 2008

En mängd olika XSL provningsförhållanden (Insamling av XSL: IF och XSL: När testmetoder)

Varje gång måste jag göra en XSL: IF eller XSL: När testet, jag måste gå tillbaka till uppslagsverk. Jag tycks aldrig komma ihåg dem. Trodde att det skulle vara mer där ute, precis som jag, som skulle hellre föredra att ha dem alla, möjligt på ett ställe, redo att hänvisas vid behov.

För dem som är nya ... Syntax för XSL: IF

<xsl:if test="expression">
<- Innehåll: template ->
</ Xsl: if>

XSL: om / xsl: när Test Collection
Villkoren nedan är alla enkla och självförklarande. Så jag tror att det inte behöver mycket förklaring

<xsl:if test="position()=last()-1">
Detta om det sista, men en del i listan!
</ Xsl: if>

<xsl:if test="SALARY> 5000 ">
Lönen för denna person är större än skivor. 5000
</ Xsl: if>

<xsl:if test="count(JOBS)> 3 ">
Det finns mer än 3 jobb i den här listan!
</ Xsl: if>

<xsl:if test="(@DEPT ='SALES') eller (@JOINYEAR = '1997')">
Denna person är från säljavdelningen Eller hans år att gå med är 1997
</ Xsl: if>

<xsl:if test="EXPERIENCE">
Denna person har iallafall en del EXPERIENCE barn.
</ Xsl: if>

<xsl:if test="@HOBBY">
Personen har en hobby attribut.
</ Xsl: if>

Samma text betingelser skulle kunna användas för XSL: VÄLJ / xsl: NÄR samt

xsl: välj

XSLT: s xsl: Välj instruktionen liknar xsl: om men har några viktiga skillnader:
• En xsl: Välj element kan testa för mer än ett tillstånd och lägga till olika noder till resultatet trädet baserat på vilka villkor är sant.
• En xsl: välj elementet kan ha en standardmall för att lägga till resultatet träd om inget av villkoren är sanna. (Jämför xsl: om, som inte har någon motsvarighet ett "annat" tillstånd.)
• Den xsl: välj element har specifika underelement som är nödvändiga för att det ska fungera, samtidigt som du kan sätta några välformade element du vill insidan av en xsl: if element.

<xsl:choose>
<xsl:when test="boolean-expression">
Gör något när denna boolskt-uttryck är TURE
</ Xsl: när>
<xsl:otherwise> Gör något annat </ xsl: annat>
</ Xsl: välj>


2008 13 Augusti 2008

Tokenizing Avgränsad String inne i en XSL

Om dina krav är att dela en nod värde i ett XML, som innehåller en avgränsad sträng av värde, till enskilda poster, så har du kommit rätt ... ta en titt på exemplet nedan. Om du är bekant med en liten bit av XML och XSL ... Jag tror inte du skulle behöva någon förklaring.
Även detta exempel användning av XSL funktioner som xsl: call-mall, xsl: delsträng-före, xsl: delsträng-efter, om det är vad du är ute efter.

XML för att omvandlas (food.xml): -
Antag att uppgiften är att tokenize strängen avgränsas med kommatecken, i taggen "sökord"

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="food.xsl"?>
<food>
<date>July 2008</date>
<description>All about things we eat everyday</description>
<keywords>Fruits, Vegetables, Pulses, Meat, Cereals </keywords>
</food>

XSL (food.xsl): -

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>XSL 1.0 Delimited String Tokeniser</title>
</head>
<body>
<xsl:value-of select="food/meta"/>
<div >
<xsl:call-template name="tokenize">
<xsl:with-param name="string" select="food/keywords" />
<xsl:with-param name="delimitr" select="','" />
</xsl:call-template>

</div>
</body>
</html>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="string" />
<xsl:param name="delimitr" />
<xsl:choose>
<xsl:when test="contains($string, $delimitr)">
<div style="border:1px solid red;">
<h3><xsl:value-of select="substring-before($string,$delimitr)" /></h3>
<xsl:variable name="data" select="substring-before($string,$delimitr)"/>
</div>
<xsl:call-template name="tokenize">
<xsl:with-param name="string" select="substring-after($string, $delimitr)" /><xsl:with-param name="delimitr" select="$delimitr" /></xsl:call-template>
</xsl:when>
<xsl:otherwise>
<div style="border:1px solid red;">
<h3><xsl:value-of select="$string" /></h3>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

Resultat utgång HTML: -

<div>
<div style="border: 1px solid red;">
<h3>Fruits</h3>
</div>
<div style="border: 1px solid red;">
<h3> Vegetables</h3>
</div>
<div style="border: 1px solid red;">
<h3> Pulses</h3>
</div>
<div style="border: 1px solid red;">
<h3> Meat</h3>
</div>
<div style="border: 1px solid red;">
<h3> Cereals </h3>
</div>
</div>

Onödigt att säga ... bara ändra parametern "delimitr" till avgränsare du vill


2008 4 augusti 2008

Ett problem med position () i XSL ... eller är det?

Jag hade lever i en märklig problem när du skapar en XSL idag. Tittade efter svar hela nätet, men kunde inte hitta några .... Egentligen Jag antar! Jag uppkomsten vet vad mitt problem var, så vad ser jag för?

Ändå! Bara om du har detta mycket samma problem också och på något sätt genom kraften i kraft du lyckats landa på denna sida ... du skulle tacka mig massor ... Och om du har råkat hamnat på denna sida av någon underlig öde och du råkar vara en XSL utvecklare, GÖR En anteckning om NU, för framtiden orsak, om en dag, du möter det här problemet, då FORCE kanske inte med dig.

Problem uttalande:
Jag har denna XML, där det finns två noder med flera objekt i den och de poster mellan dessa två noder har en 1-1 korrespondens. I exemplet nedan varje post i noden <array name="PLAYURL" /> avser (motsvarande position) till ett objekt i noden <array name="SITENAME" />

<?xml version="1.0" encoding="utf-8"?>
<myplaylists>
<playlist>
<title>Best of Rest </title>
<array name="SITENAME">
<str>www.musicindiaonline.com</str>
<str>www.dhingana.com</str>
<str>www.raaga.com</str>
<str>www.smashits.com</str>
<str>www.desimusic.com</str>
<str>www.musicplug.in</str>
</array>
<array name="PLAYURL">
<str>http://www.musicindiaonline.com/123/</str>
<str>http://www.dhingana.com/play/123</str>
<str>http://www.raaga.com/123</str>
<str>http://ww.smashits.com/123</str>
<str>http://www.desimusic.com/123</str>
<str>http://www.musicplug.in/123</str>
</array>
</playlist>
</myplaylists>

Nu har jag en slinga, där jag loop through <array name="SITENAME">, och jag vill få den relaterade posten (vid motsvarande position) i <array name="PLAYURL">,

Vad du skulle Normalt försöker göra är ...

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
play from : <a href="{../../array[@name='PLAY']/str[position()]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

SORRY! DENNA brukar fungera ... Ah!! Surpised ...

Nu skulle du förmodligen vill prova, ungefär så här ...

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos"> <xsl:value-of select="position()"/></xsl:variable>
play from : <a href="{../../array[@name='PLAY']/str[$pos]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

Och Återigen brukar fungera ... Nu kliar huvudet, försöker kontakta alla som du tror känner till några XSL och kan vara till någon hjälp ... du försöker alla andra alternativ ... och ändå brukar fungera ... Tja! Thats vad som hände mig iallafall ...

DONT förtvivlan!! Try This

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos-int" select="position()" />
play from : <a href="{../../array[@name='PLAY']/str[$
<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos-int" select="position()" />
play from : <a href="{../../array[@name='PLAY']/str[$ pos-int ]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>
]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

Dont frågar mig varför det fungerar. För jag dont har en rätt anledning ... om du gör! Var snäll och släppa en kommentar. Det kan vara ganska användbar. Också! om du har bättre rätt för det här inlägget, gör släpp mig en linje :)


2008 2 augusti 2008

Ställa in DOCTYPE i XSL

Förra veckan skapade jag en progessive HTML / CSS layout för en klient, testade den i IE6, IE7 och FF 3, verkade väl bra ... tills! layouten gick längre ner i manufacting cykeln. Det misslyckades. Sidlayout element gick bara överallt när HTML layouten omvandlades till XSL och XML tillämpas på det ... Bummer!

Kunde inte sova ok under helgen, i väntan på måndag morgon, när jag måste fixa detta SH **. Men nu har lite experince att hantera denna typ av situationer (Webbläsare Quirks, jag menar), jag visste det hade att göra med inget annat än DOCTYPE .... och det var ...

Problem:
Du vill ha kontroll över DOCTYPE, eftersom din förvandling kommer att innehålla en standard DOCTYPE explicit, och du layout kommer att vara borta ett dugg.

Lösningen:
XSLT specs ger utgående metoder för att ställa in en DOCTYPE för val. Även för oss UI utvecklare skulle intresseområden är HTML-utdata metoder och XML metoder produktion .

Tja! innan du blir uttråkad, här är den fix.

För t.ex. Om du hade följande DOCTYPE i din HTML-versionen. -

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

Sedan i XSL du måste ha följande: -

<xsl:output method="html" doctype-system="http://www.w3.org/TR/html4/loose.dtd" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" indent="yes" />

och slutligen! gör att din XSLT utgång lyder DOCTYPE du har valt.


2008 4 maj 2008

Innefattar XSL inuti XSL

Om XML / XSL Förvandlas är din domian, då finns det tillfällen då vi vill ha en lappa av Dynamic kod som ska användas bibliotekspost (göras återanvändbar). Vad jag menar, skulle förmodligen bli mer tydliga med detta exempel scenario.

Tänk dig att du skapar en webbplats (och med hjälp av XML, XSL transfroms självklart) och de flesta av sidorna skulle ha en Kommentar modul. Tja! sedan antingen du kopiera eller klistra in den här koden i varje sidmall (som jag inte har något att säga, men gör underhåll och omarbetningar en mardröm) eller ännu bättre, skapar du en include-fil som kan dras in var du vill ha det i din sida ( s) ...
Så Hur skapar vi en XSL INCLUDE fil och inkludera den i en annan XSL fil? Här är hur ...

Bara för att göra saker klart ... här är snabb lista över filer som du skulle skapa ... här kommer vi bland annat info om frukt och grönsaker till en överordnad sida som heter mat.

1. food.xml - XML-datafil som omvandlingen ska tillämpas
2. food.xsl - Main XSL-fil, som kommer att förändra vårt food.xml
3. inc_fruits.xsl - XSL innehåller fil som kommer att göra frukt uppgifter
4. inc_vegtables.xsl - XSL innehåller fil som kommer att göra vetetables uppgifter

Jag tror inte jag har att förklara mycket, koderna för ovanstående faktorer kommer att vara självförklarande ...

FOOD.XML


<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="food.xsl"?>
<food>
<date>July 2008</date>
<description>All about things we eat everyday</description>
<fruits type="tropical">
<item name="mango" moreinfo="http://www.mango.com">Mango is the king of fruits</item>
<item name="banana" moreinfo="http://www.banana.com">Banana once a day , keeps the doctor away</item>
<item name="orange" moreinfo="http://www.orange.com">Orange is the color and rich in vitamin C</item>
<item name="Papaya" moreinfo="http://www.papaya.com">Papaya - Hot when raw, cold when ripe</item>
</fruits>

<vegetables>
<item name="spinach" moreinfo="http://www.spinach.com">Spinach is full of iron</item>
<item name="asparagus" moreinfo="http://www.asparagus.com">Asparagus contains loads of vitamin D </item>
<item name="fenugreek" moreinfo="http://www.fenugreek.com">Fenugreek is rich in vitamin C</item>
</vegetables>
</food>


FOOD.XSL


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="inc_fruits.xsl" />
<xsl:include href="inc_vegetables.xsl" />
<xsl:template match="/">
<html>
<head>
<title>Title</title>
</head>
<body>
<h3><xsl:value-of select="/food/description" /></h3>
Modification Date : <xsl:value-of select="/food/date" />
<hr/>
<h5> About Fruits</h5>
<xsl:call-template name="about_fruits"/>

<hr/>
<h5> About Vegetables</h5>
<xsl:call-template name="about_vegetables"/>

<hr/>
</ Body>
</ Html>
</ Xsl: template>
</ Xsl: stylesheet>


INC_FRUITS.XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1" />
<xsl:template name="about_fruits">
<xsl:for-each select="/food/fruits/item/@*">
attribute name : <xsl:value-of select="name()"/>
attribute value : <xsl:value-of select="."/> <br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


INC_VEGETABLES.XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1" />
<xsl:template name="about_vegetables">
<xsl:for-each select="/food/vegetables/item/@*">
attribute name : <xsl:value-of select="name()"/>
attribute value : <xsl:value-of select="."/> <br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Ladda ner alla dessa filer här (252 nedladdningar)


2008 4 April, 2008

Arbeta med XML-nod attribut i XSLT

Om du använder XML och XSL, då kanske du har stött på en tid, när man har att leka med attribut och värderingar XML noder i dig XSL. De är massor av platser med långa omständlig info om detta, men ingen jag hittade var kortfattade och precisa ... Detta är inte XML / XSL tutorial, men mitt försök att sätta-ihop några slags fusk lista ...

Provet XML att vi kommer att arbeta med ser ut så här ...

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="food.xsl"?>
<food>
<fruits type="tropical">
<item name="mango" moreinfo="http://www.mango.com">Mango is the king of fruits</item>
<item name="banana" moreinfo="http://www.banana.com">Banana once a day , keeps the doctor away</item>
<item name="orange" moreinfo="http://www.orange.com">Orange is the color and rich in vitamin C</item>
<item name="Papaya" moreinfo="http://www.papaya.com">Papaya - Hot when raw, cold when ripe</item>
</fruits>
</food>

Så låter börja omvandla våra ovan XML med XSL

Exempel 1: Visar värdet vid en vald attribut

<xsl:value-of select="/food/fruits/item[@name='orange']" /><br />
to get more information about <a href="{/food/fruits/item[@name='orange']/@moreinfo}" target="new" ><xsl:value-of select="/food/fruits/item[@name='orange']/@name" /> </a>

HTML-resultat kommer att se ut

Orange is the color and rich in vitamin C,
to get more information about <a href="http://www.orange.com" target="new">


Exempel 2: Looping igenom och visa alla XML attributnamn och deras värderingar

<xsl:for-each select="/food/fruits/item/@*">
attribute name : <xsl:value-of select="name()"/>,
attribute value : <xsl:value-of select="."/> <br />
</xsl:for-each>

HTML-resultat kommer att se ut


attribute name : name, attribute value : mango
attribute name : moreinfo, attribute value : http://www.mango.com
attribute name : name, attribute value : banana
attribute name : moreinfo, attribute value : http://www.banana.com
attribute name : name, attribute value : orange
attribute name : moreinfo, attribute value : http://www.orange.com
attribute name : name, attribute value : Papaya
attribute name : moreinfo, attribute value : http://www.papaya.com


Ladda ner alla dessa filer här (245 nedladdningar)



Titta på detta utrymme, jag håller uppdatera detta med nya rön ...


NDK hem | Att uttrycka IT | uttrycka Palate | uttrycka Penmenship | uttrycka Awe | uttrycka mig