2009-07-20 30 views
1

您不确定这是否可行,但我想要更新<主体>标签来更改我的zend框架应用程序中的onload函数。使用zend框架更新身体标记中的javascript

应用程序正在使用的布局使身体标记目前看起来像我从谷歌地图加载此<体类=“trandra” >

在我的观点一个

但是,它需要以下在身体标记这期特别<身体的onload =“初始化()” onunload的=“GUnload()” >

正如你能理解我不希望这种情况在我的布局进行硬编码,因为这会导致不所有的噩梦与不同的意见。

如何完成程序设计,如果完全有可能的话?即时通讯使用headScript函数来添加JavaScript所以是否有一个等效于身体标记?

在此先感谢...

回答

3

一个方法 - 使用可变布局

一个想法是以下几点:

<body class="trandra" <?php echo $this->layout()->bodyScripts ?>> 

而在你看来:

<?php 
    $this->layout->bodyScripts = 
     'onload="initialize()" onunload="GUnload()"'; 

方法2 - 附加JS文件,增加了事件处理程序

的另一种方法,这是不太显眼,不会任何影响HTML是添加一个额外的JS-文件在需要严格的观点onload和onunload处理程序。它可能是这个样子:

<?php 
    $this->headScript()->appendScript(
         '/path/to/javascripts/loadGMaps.js'); 

在你loadGMaps.js(使用prototype

Event.observe(window, 'load', function onLoadHandler() { 
    // Code for initializing Google maps here 
}); 

Event.observe(window, 'unload', function onUnloadHandler() { 
    // Code for unloading Google maps here 
}); 
2

而不是把你的Javascript直接在代码中,你也可以使用一个非obstrusive计算策略:在JavaScript堵塞时,页面完全加载。

看一看,例如,在一个叫addOnLoadEvent功能

如果您使用的是JS框架(可以在很多网站^^找到),它肯定有那种特点:

如果您注册了 “插入式” 使用h eadScript,应该不需要直接修改标签。

0

我在Zend框架的专家,所以我不知道是否有在此功能的任何建设,但你可以做这样的事情: 在布局文件: body_params?>>

然后在你的控制器,可以设置或添加到body_params:

$this->view->body_params='onload="initialize()" onunload="GUnload()"'; 
0

我知道这是一个古老的线索,但我正在浏览一些建议的解决方案,并提出了我自己的想法之一,我看过一些想法。我所做的是我在我自己的库文件扩展Zend_View的(我使用香草MVC布局,但类似的事情可以做使用,而不是下面描述的引导类的bootstrap.php)

class Custom_View extends Zend_View 
{ 
    protected $bodyAttrs = array(); 

    public function _setBodyAttr($attrName,$attrValue=null) { 
     $attrName = strtolower(strval($attrName)); 
     if(!(in_array($attrName, HTML::getValidBodyAttrs()))) { 
      throw new Zend_Exception(__METHOD__." attrName '$attrName' is not a valid BODY attribute!"); 
     } 
     $this->bodyAttrs[$attrName] = strval($attrValue); 
    } 

    public function _getBodyAttrsAsString() { 
     $bodyAttrs = ""; 
     if(count($this->bodyAttrs) > 0) { 
      $attrs = array(); 
      foreach($this->bodyAttrs as $_k => $_v) { 
       array_push($attrs,sprintf("%s=\"%s\"", $_k, $_v)); 
      } 
      $bodyAttrs = " " . implode(" ", $tags); 
     } 
     return $bodyAttrs; 
    } 
} 

// some useful tag definitions for HTML 
class HTML 
{ 
    // HTML attributes as described by W3C 
    public static $BODY_ATTRIBUTES   = array('alink','background','bgcolor','link','text','vlink'); 
    public static $GLOBAL_ATTRIBUTES   = array('accesskey','class','contenteditable','contextmenu','dir','draggable','dropzone','hidden','id','lang','spellcheck','style','tabindex','title'); 
    public static $WINDOW_EVENT_ATTRIBUTES = array('onafterprint','onbeforeprint','onbeforeunload','onerror','onhaschange','onload','onmessage','onoffline','ononline','onpagehide','onpageshow','onpopstate','onredo','onresize','onstorage','onundo','onunload'); 
    public static $MOUSE_EVENT_ATTRIBUTES = array('onclick','ondblclick','ondrag','ondragend','ondragenter','ondragleave','ondragover','ondragstart','ondrop','onmousedown','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel','onscroll'); 
    public static $KEYBOARD_EVENT_ATTRIBUTES = array('onkeydown','onkeypress','onkeyup'); 
    public static $FORM_EVENT_ATTRIBUTES  = array('onblur','onchange','oncontextmenu','onfocus','onformchange','onforminput','oninput','oninvalid','onreset','onselect','onsubmit'); 
    public static $MEDIA_EVENT_ATTRIBUTES = array('onabort','oncanplay','oncanplaythrough','ondurationchange','onemptied','onended','onerror','onloadeddata','onloadedmetadata','onloadstart','onpause','onplay','onplaying','onprogress','onratechange','onreadystatechange','onseeked','onseeking','onstalled','onsuspend','ontimeupdate','onvolumechange','onwaiting'); 

    public static function getValidBodyAttrs() { 
     return array_merge(self::$BODY_ATTRIBUTES,self::$GLOBAL_ATTRIBUTES,self::$WINDOW_EVENT_ATTRIBUTES,self::$MOUSE_EVENT_ATTRIBUTES,self::$KEYBOARD_EVENT_ATTRIBUTES); 
    } 
} 

创建此之后文件我添加了一个方法_initView到的bootstrap.php文件指向的index.php文件,并在的application.ini应用程序的根目录下:

protected function _initView() 
{ 
    // Custom_View extends Zend_View 
    $view = new Custom_View(); 

    // Add it to the ViewRenderer 
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); 
    $viewRenderer->setView($view); 

    return $view; 
} 

新的,扩展的Zend_View现在允许沿增加你的身体标记有一些简单的有效性检查。修改你的布局的身体标记获取属性:

<body<?= $this->_getBodyAttrs(); ?>> 

一旦你有了这个设置,你可以在控制器

$this->view->_setBodyAttr('key','val'); 

或增加你的身体标记任何给定的观点

$this->_setBodyAttr('key','val');