Sveiki!
Pagājušajā nedēļā nedaudz aplūkoju jauno Internet Explorer 8 betu. Neskatoties uz dažādām ar betu saistītām problēmām, tajā ir vairāki jauninājumi (salīdzinot ar septīto versiju, nevis astotās pirmo betu), kuri man šķiet interesanti un noderīgi. Viens no tiem ir tā sauktie "accelerators", kas kontekstjūtīgajā izvēlnē pievieno dažādus tīmekļa pakalpojumus, piemēram, iezīmētā vārda paskaidrošanu, izmantojot Encarta enciklopēdiju.
Tā kā man šī funkcionalitāte ļoti iepatikās, tad nolēmu paspēlēties un izveidot savu akseleratoru. Sākumā, lai demonstrētu tehnoloģiju izveidosim pavisam vienkāršu akseleratoru, kurš parādīs iezīmēto tekstu.
Tagad, kad ir zināma prasību specifikācija, varam sākt apskatīt tehniskās detaļas. Kā jau minēju, akseleratori ir domāti, lai izmantotu tīmekļa pakalpojumus, tāpēc to darbības principu var reducēt līdz tīmekļa lapas atvēršanai ar norādītajiem parametriem. Mūsu gadījumā asp.net lapa būs ļoti vienkārša un sastāvēs no viena literal elementa.
<form id="form1" runat="server">
<div>
<asp:Literal runat="server" ID="litOutput" />
</div>
</form>
Page_Load() metodē aizpildam litOutput elementu ar parametra vērtību.
protected void Page_Load(object sender, EventArgs e)
{
litOutput.Text = Request["text"];
}
Šajā reizē tas arī ir viss, kas nepieciešams akselerātora darbināšanai. Tagad nepieciešams iemācīt Internet Explorer jauno akseleratoru. Lai to izdarītu ir nepieciešams izveidot OpenService aprakstu, kas ir XML fails, kurā ir aprakstīts viss nepieciešamais, lai izsauktu pakalpojuma piedāvātāja lapu ar nepieciešamajiem parametriem. Mūsu demo akseleratoram šis apraksts varētu būt šāds:
<?xml version="1.0" encoding="UTF-8"?>
<os:openServiceDescription
xmlns:os="http://www.microsoft.com/schemas/openservicedescription/1.0">
<os:homepageUrl>http://localhost:1663/</os:homepageUrl>
<os:display>
<os:name>Demo</os:name>
<os:icon>http://localhost:1663/icon.ico</os:icon>
<os:description>Demo akselerators, kurš parāda iezīmēto vārdu.</os:description>
</os:display>
<os:activity category="Demo">
<os:activityAction context="selection">
<os:preview action="http://localhost:1663/Default.aspx" method="get">
<os:parameter name="text" value="{selection}" type="text" />
</os:preview>
<os:execute action="http://localhost:1663/Default.aspx" method="get">
<os:parameter name="text" value="{selection}" type="text" />
</os:execute>
</os:activityAction>
</os:activity>
</os:openServiceDescription>
Kā redzams, viss ir diezgan saprotams, tāpēc sīkāk katru sadaļu nekomentēšu. Interesenti var MSDN palasīt sīkāku aprakstu.
Tālāk ir nepieciešams kādā lapā izvietot javascript funkcijas izsaukumu, kas pievieno akseleratoru.
<button id="btnAdd" onclick="window.external.AddService('http://localhost:1663/DemoAccleratorDescription.xml')">
Pievienot akseleratoru IE8</button>
</form>
Tagad atverot izveidoto lapu ir redzama poga, kuru nospiežot Internet Explorer piedāvā pievienot jauno akseleratoru.
Tagad var pārbaudīt jauno akseleratoru kādā tīmekļa lapā:
Kā redzams, mūsu izveidotajam akseleratoram ir viens trūkums - lai gan tas jau ir pievienots Internet Explorer, lapa joprojām piedāvā to pievienot. Lai to novērstu Internet Explorer ir pieejama javascript funkcija, kas ļauj pārbaudīt, vai šāds akselerators jau ir pievienots. Lai paslēptu pievienošanas pogu, gadījumā ja akselerators jau ir pievienots, lapas onload metodā ir jāpievieno neliels javascript fragments.
<script type="text/javascript">
window.onload = function()
{
if (window.external.IsServiceInstalled('http://localhost:1663/','demo'))
{
document.getElementById('btnAdd').disabled = true;
}
}
</script>
Diemžēl, ir problēmas, ja šis javascript tiek izmantots lapā, kas ir akseleratora priekšskats (preview). Lai to apietu, nepieciešams nelielas izmaiņas. Pirmkārt, akseleratora definīcijas XML failā izmainīt URL, kas norāda uz priekšskata lapu, pievienojot papildus parametru.
<os:preview action="http://localhost:1663/Default.aspx?preview=yes" method="get">
Otrkārt, lapas kodā jāpievieno property, kas norāda vai ir priekšskata režīms:
protected bool IsPreview
{
get
{
return !String.IsNullOrEmpty(Request.Params["preview"]) &&
Request.Params["preview"].Equals("yes", StringComparison.InvariantCultureIgnoreCase);
}
}
Un jāizmaina aspx lapas kods:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Accelerator demo</title>
<%if (!IsPreview)
{%>
<script type="text/javascript">
window.onload = function()
{
if (window.external.IsServiceInstalled('http://localhost:1663/','demo'))
{
document.getElementById('btnAdd').disabled = true;
}
}
</script>
<%}%>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Literal runat="server" ID="litOutput" />
</div>
<%if (!IsPreview)
{%>
<button id="btnAdd" onclick="window.external.AddService('http://localhost:1663/DemoAcceleratorDescription.xml')">
Pievienot akseleratoru IE8</button>
<%} %>
</form>
</body>
</html>
Tagad preview režīms ir bez liekās pogas, un arī atverot lapu, mums vairs netiek piedāvāts pievienot akseleratoru.
Kā parasti pievienoju arī pirmkodu
P.S. Izstrādei un testēšanai izmantojot Visual Studio 2008 iebūvēto web serveri. Lai darbinātu piemēru, visticamākais, nāksies mainīt URL norādīto porta numuru.